Renamed generic_stm32f103rxx and generic_stm32f103zxx to remove th e xx at the end to match changes to boards.txt
This commit is contained in:
parent
30946d8a1c
commit
13e27c1dc5
|
@ -1,220 +1,220 @@
|
||||||
/*
|
/*
|
||||||
* Linker script for libmaple.
|
* Linker script for libmaple.
|
||||||
*
|
*
|
||||||
* Original author "lanchon" from ST forums, with modifications by LeafLabs.
|
* Original author "lanchon" from ST forums, with modifications by LeafLabs.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configure other libraries we want in the link.
|
* Configure other libraries we want in the link.
|
||||||
*
|
*
|
||||||
* libgcc, libc, and libm are common across supported toolchains.
|
* libgcc, libc, and libm are common across supported toolchains.
|
||||||
* However, some toolchains require additional archives which aren't
|
* However, some toolchains require additional archives which aren't
|
||||||
* present everywhere (e.g. ARM's gcc-arm-embedded releases).
|
* present everywhere (e.g. ARM's gcc-arm-embedded releases).
|
||||||
*
|
*
|
||||||
* To hack around this, we let the build system specify additional
|
* To hack around this, we let the build system specify additional
|
||||||
* archives by putting the right extra_libs.inc (in a directory under
|
* archives by putting the right extra_libs.inc (in a directory under
|
||||||
* toolchains/) in our search path.
|
* toolchains/) in our search path.
|
||||||
*/
|
*/
|
||||||
GROUP(libgcc.a libc.a libm.a)
|
GROUP(libgcc.a libc.a libm.a)
|
||||||
INCLUDE extra_libs.inc
|
INCLUDE extra_libs.inc
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These force the linker to search for vector table symbols.
|
* These force the linker to search for vector table symbols.
|
||||||
*
|
*
|
||||||
* These symbols vary by STM32 family (and also within families).
|
* These symbols vary by STM32 family (and also within families).
|
||||||
* It's up to the build system to configure the link's search path
|
* It's up to the build system to configure the link's search path
|
||||||
* properly for the target MCU.
|
* properly for the target MCU.
|
||||||
*/
|
*/
|
||||||
INCLUDE vector_symbols.inc
|
INCLUDE vector_symbols.inc
|
||||||
|
|
||||||
/* STM32 vector table. */
|
/* STM32 vector table. */
|
||||||
EXTERN(__stm32_vector_table)
|
EXTERN(__stm32_vector_table)
|
||||||
|
|
||||||
/* C runtime initialization function. */
|
/* C runtime initialization function. */
|
||||||
EXTERN(start_c)
|
EXTERN(start_c)
|
||||||
|
|
||||||
/* main entry point */
|
/* main entry point */
|
||||||
EXTERN(main)
|
EXTERN(main)
|
||||||
|
|
||||||
/* Initial stack pointer value. */
|
/* Initial stack pointer value. */
|
||||||
EXTERN(__msp_init)
|
EXTERN(__msp_init)
|
||||||
PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram));
|
PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram));
|
||||||
|
|
||||||
/* Reset vector and chip reset entry point */
|
/* Reset vector and chip reset entry point */
|
||||||
EXTERN(__start__)
|
EXTERN(__start__)
|
||||||
ENTRY(__start__)
|
ENTRY(__start__)
|
||||||
PROVIDE(__exc_reset = __start__);
|
PROVIDE(__exc_reset = __start__);
|
||||||
|
|
||||||
/* Heap boundaries, for libmaple */
|
/* Heap boundaries, for libmaple */
|
||||||
EXTERN(_lm_heap_start);
|
EXTERN(_lm_heap_start);
|
||||||
EXTERN(_lm_heap_end);
|
EXTERN(_lm_heap_end);
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
.text :
|
.text :
|
||||||
{
|
{
|
||||||
__text_start__ = .;
|
__text_start__ = .;
|
||||||
/*
|
/*
|
||||||
* STM32 vector table. Leave this here. Yes, really.
|
* STM32 vector table. Leave this here. Yes, really.
|
||||||
*/
|
*/
|
||||||
*(.stm32.interrupt_vector)
|
*(.stm32.interrupt_vector)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Program code and vague linking
|
* Program code and vague linking
|
||||||
*/
|
*/
|
||||||
*(.text .text.* .gnu.linkonce.t.*)
|
*(.text .text.* .gnu.linkonce.t.*)
|
||||||
*(.plt)
|
*(.plt)
|
||||||
*(.gnu.warning)
|
*(.gnu.warning)
|
||||||
*(.glue_7t) *(.glue_7) *(.vfp11_veneer)
|
*(.glue_7t) *(.glue_7) *(.vfp11_veneer)
|
||||||
|
|
||||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||||
*(.gcc_except_table)
|
*(.gcc_except_table)
|
||||||
*(.eh_frame_hdr)
|
*(.eh_frame_hdr)
|
||||||
*(.eh_frame)
|
*(.eh_frame)
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
KEEP(*(.init))
|
KEEP(*(.init))
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__preinit_array_start = .;
|
__preinit_array_start = .;
|
||||||
KEEP (*(.preinit_array))
|
KEEP (*(.preinit_array))
|
||||||
__preinit_array_end = .;
|
__preinit_array_end = .;
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__init_array_start = .;
|
__init_array_start = .;
|
||||||
KEEP (*(SORT(.init_array.*)))
|
KEEP (*(SORT(.init_array.*)))
|
||||||
KEEP (*(.init_array))
|
KEEP (*(.init_array))
|
||||||
__init_array_end = .;
|
__init_array_end = .;
|
||||||
|
|
||||||
. = ALIGN(0x4);
|
. = ALIGN(0x4);
|
||||||
KEEP (*crtbegin.o(.ctors))
|
KEEP (*crtbegin.o(.ctors))
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
|
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
|
||||||
KEEP (*(SORT(.ctors.*)))
|
KEEP (*(SORT(.ctors.*)))
|
||||||
KEEP (*crtend.o(.ctors))
|
KEEP (*crtend.o(.ctors))
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
KEEP(*(.fini))
|
KEEP(*(.fini))
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__fini_array_start = .;
|
__fini_array_start = .;
|
||||||
KEEP (*(.fini_array))
|
KEEP (*(.fini_array))
|
||||||
KEEP (*(SORT(.fini_array.*)))
|
KEEP (*(SORT(.fini_array.*)))
|
||||||
__fini_array_end = .;
|
__fini_array_end = .;
|
||||||
|
|
||||||
KEEP (*crtbegin.o(.dtors))
|
KEEP (*crtbegin.o(.dtors))
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
|
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
|
||||||
KEEP (*(SORT(.dtors.*)))
|
KEEP (*(SORT(.dtors.*)))
|
||||||
KEEP (*crtend.o(.dtors))
|
KEEP (*crtend.o(.dtors))
|
||||||
} > REGION_TEXT
|
} > REGION_TEXT
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* End of text
|
* End of text
|
||||||
*/
|
*/
|
||||||
.text.align :
|
.text.align :
|
||||||
{
|
{
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
__text_end__ = .;
|
__text_end__ = .;
|
||||||
} > REGION_TEXT
|
} > REGION_TEXT
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* .ARM.exidx exception unwinding; mandated by ARM's C++ ABI
|
* .ARM.exidx exception unwinding; mandated by ARM's C++ ABI
|
||||||
*/
|
*/
|
||||||
__exidx_start = .;
|
__exidx_start = .;
|
||||||
.ARM.exidx :
|
.ARM.exidx :
|
||||||
{
|
{
|
||||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||||
} > REGION_RODATA
|
} > REGION_RODATA
|
||||||
__exidx_end = .;
|
__exidx_end = .;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* .data
|
* .data
|
||||||
*/
|
*/
|
||||||
.data :
|
.data :
|
||||||
{
|
{
|
||||||
__data_start__ = .;
|
__data_start__ = .;
|
||||||
LONG(0)
|
LONG(0)
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
|
|
||||||
*(.got.plt) *(.got)
|
*(.got.plt) *(.got)
|
||||||
*(.data .data.* .gnu.linkonce.d.*)
|
*(.data .data.* .gnu.linkonce.d.*)
|
||||||
|
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
__data_end__ = .;
|
__data_end__ = .;
|
||||||
} > REGION_DATA AT> REGION_RODATA
|
} > REGION_DATA AT> REGION_RODATA
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read-only data
|
* Read-only data
|
||||||
*/
|
*/
|
||||||
.rodata :
|
.rodata :
|
||||||
{
|
{
|
||||||
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
||||||
/* .USER_FLASH: We allow users to allocate into Flash here */
|
/* .USER_FLASH: We allow users to allocate into Flash here */
|
||||||
*(.USER_FLASH)
|
*(.USER_FLASH)
|
||||||
/* ROM image configuration; for C startup */
|
/* ROM image configuration; for C startup */
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_lm_rom_img_cfgp = .;
|
_lm_rom_img_cfgp = .;
|
||||||
LONG(LOADADDR(.data));
|
LONG(LOADADDR(.data));
|
||||||
/*
|
/*
|
||||||
* Heap: Linker scripts may choose a custom heap by overriding
|
* Heap: Linker scripts may choose a custom heap by overriding
|
||||||
* _lm_heap_start and _lm_heap_end. Otherwise, the heap is in
|
* _lm_heap_start and _lm_heap_end. Otherwise, the heap is in
|
||||||
* internal SRAM, beginning after .bss, and growing towards
|
* internal SRAM, beginning after .bss, and growing towards
|
||||||
* the stack.
|
* the stack.
|
||||||
*
|
*
|
||||||
* I'm shoving these here naively; there's probably a cleaner way
|
* I'm shoving these here naively; there's probably a cleaner way
|
||||||
* to go about this. [mbolivar]
|
* to go about this. [mbolivar]
|
||||||
*/
|
*/
|
||||||
_lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end;
|
_lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end;
|
||||||
_lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init;
|
_lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init;
|
||||||
} > REGION_RODATA
|
} > REGION_RODATA
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* .bss
|
* .bss
|
||||||
*/
|
*/
|
||||||
.bss :
|
.bss :
|
||||||
{
|
{
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
__bss_start__ = .;
|
__bss_start__ = .;
|
||||||
*(.bss .bss.* .gnu.linkonce.b.*)
|
*(.bss .bss.* .gnu.linkonce.b.*)
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
. = ALIGN (8);
|
. = ALIGN (8);
|
||||||
__bss_end__ = .;
|
__bss_end__ = .;
|
||||||
_end = __bss_end__;
|
_end = __bss_end__;
|
||||||
} > REGION_BSS
|
} > REGION_BSS
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Debugging sections
|
* Debugging sections
|
||||||
*/
|
*/
|
||||||
.stab 0 (NOLOAD) : { *(.stab) }
|
.stab 0 (NOLOAD) : { *(.stab) }
|
||||||
.stabstr 0 (NOLOAD) : { *(.stabstr) }
|
.stabstr 0 (NOLOAD) : { *(.stabstr) }
|
||||||
/* DWARF debug sections.
|
/* DWARF debug sections.
|
||||||
* Symbols in the DWARF debugging sections are relative to the beginning
|
* Symbols in the DWARF debugging sections are relative to the beginning
|
||||||
* of the section so we begin them at 0. */
|
* of the section so we begin them at 0. */
|
||||||
/* DWARF 1 */
|
/* DWARF 1 */
|
||||||
.debug 0 : { *(.debug) }
|
.debug 0 : { *(.debug) }
|
||||||
.line 0 : { *(.line) }
|
.line 0 : { *(.line) }
|
||||||
/* GNU DWARF 1 extensions */
|
/* GNU DWARF 1 extensions */
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
/* DWARF 1.1 and DWARF 2 */
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
.debug_aranges 0 : { *(.debug_aranges) }
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||||
/* DWARF 2 */
|
/* DWARF 2 */
|
||||||
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||||
.debug_line 0 : { *(.debug_line) }
|
.debug_line 0 : { *(.debug_line) }
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
.debug_frame 0 : { *(.debug_frame) }
|
||||||
.debug_str 0 : { *(.debug_str) }
|
.debug_str 0 : { *(.debug_str) }
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
.debug_loc 0 : { *(.debug_loc) }
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
/* SGI/MIPS DWARF 2 extensions */
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
.debug_weaknames 0 : { *(.debug_weaknames) }
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
.debug_funcnames 0 : { *(.debug_funcnames) }
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
.debug_typenames 0 : { *(.debug_typenames) }
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
.debug_varnames 0 : { *(.debug_varnames) }
|
||||||
|
|
||||||
.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
|
.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
|
||||||
.ARM.attributes 0 : { KEEP (*(.ARM.attributes)) }
|
.ARM.attributes 0 : { KEEP (*(.ARM.attributes)) }
|
||||||
/DISCARD/ : { *(.note.GNU-stack) }
|
/DISCARD/ : { *(.note.GNU-stack) }
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi-
|
* Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi-
|
||||||
* releases (https://launchpad.net/gcc-arm-embedded/).
|
* releases (https://launchpad.net/gcc-arm-embedded/).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* This is for the provided newlib. */
|
/* This is for the provided newlib. */
|
||||||
GROUP(libnosys.a)
|
GROUP(libnosys.a)
|
|
@ -1,26 +1,26 @@
|
||||||
/*
|
/*
|
||||||
* libmaple linker script for "Flash" builds.
|
* libmaple linker script for "Flash" builds.
|
||||||
*
|
*
|
||||||
* A Flash build puts .text (and .rodata) in Flash, and
|
* A Flash build puts .text (and .rodata) in Flash, and
|
||||||
* .data/.bss/heap (of course) in SRAM, but offsets the sections by
|
* .data/.bss/heap (of course) in SRAM, but offsets the sections by
|
||||||
* enough space to store the Maple bootloader, which lives in low
|
* enough space to store the Maple bootloader, which lives in low
|
||||||
* Flash and uses low memory.
|
* Flash and uses low memory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This pulls in the appropriate MEMORY declaration from the right
|
* This pulls in the appropriate MEMORY declaration from the right
|
||||||
* subdirectory of stm32/mem/ (the environment must call ld with the
|
* subdirectory of stm32/mem/ (the environment must call ld with the
|
||||||
* right include directory flags to make this happen). Boards can also
|
* right include directory flags to make this happen). Boards can also
|
||||||
* use this file to use any of libmaple's memory-related hooks (like
|
* use this file to use any of libmaple's memory-related hooks (like
|
||||||
* where the heap should live).
|
* where the heap should live).
|
||||||
*/
|
*/
|
||||||
INCLUDE mem-flash.inc
|
INCLUDE mem-flash.inc
|
||||||
|
|
||||||
/* Provide memory region aliases for common.inc */
|
/* Provide memory region aliases for common.inc */
|
||||||
REGION_ALIAS("REGION_TEXT", rom);
|
REGION_ALIAS("REGION_TEXT", rom);
|
||||||
REGION_ALIAS("REGION_DATA", ram);
|
REGION_ALIAS("REGION_DATA", ram);
|
||||||
REGION_ALIAS("REGION_BSS", ram);
|
REGION_ALIAS("REGION_BSS", ram);
|
||||||
REGION_ALIAS("REGION_RODATA", rom);
|
REGION_ALIAS("REGION_RODATA", rom);
|
||||||
|
|
||||||
/* Let common.inc handle the real work. */
|
/* Let common.inc handle the real work. */
|
||||||
INCLUDE common.inc
|
INCLUDE common.inc
|
|
@ -1,31 +1,31 @@
|
||||||
/*
|
/*
|
||||||
* libmaple linker script for "JTAG" builds.
|
* libmaple linker script for "JTAG" builds.
|
||||||
*
|
*
|
||||||
* A "JTAG" build puts .text (and .rodata) in Flash, and
|
* A "JTAG" build puts .text (and .rodata) in Flash, and
|
||||||
* .data/.bss/heap (of course) in SRAM, but links starting at the
|
* .data/.bss/heap (of course) in SRAM, but links starting at the
|
||||||
* Flash and SRAM starting addresses (0x08000000 and 0x20000000
|
* Flash and SRAM starting addresses (0x08000000 and 0x20000000
|
||||||
* respectively). This will wipe out a Maple bootloader if there's one
|
* respectively). This will wipe out a Maple bootloader if there's one
|
||||||
* on the board, so only use this if you know what you're doing.
|
* on the board, so only use this if you know what you're doing.
|
||||||
*
|
*
|
||||||
* Of course, a "JTAG" build is perfectly usable for upload over SWD,
|
* Of course, a "JTAG" build is perfectly usable for upload over SWD,
|
||||||
* the system memory bootloader, etc. The name is just a historical
|
* the system memory bootloader, etc. The name is just a historical
|
||||||
* artifact.
|
* artifact.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This pulls in the appropriate MEMORY declaration from the right
|
* This pulls in the appropriate MEMORY declaration from the right
|
||||||
* subdirectory of stm32/mem/ (the environment must call ld with the
|
* subdirectory of stm32/mem/ (the environment must call ld with the
|
||||||
* right include directory flags to make this happen). Boards can also
|
* right include directory flags to make this happen). Boards can also
|
||||||
* use this file to use any of libmaple's memory-related hooks (like
|
* use this file to use any of libmaple's memory-related hooks (like
|
||||||
* where the heap should live).
|
* where the heap should live).
|
||||||
*/
|
*/
|
||||||
INCLUDE mem-jtag.inc
|
INCLUDE mem-jtag.inc
|
||||||
|
|
||||||
/* Provide memory region aliases for common.inc */
|
/* Provide memory region aliases for common.inc */
|
||||||
REGION_ALIAS("REGION_TEXT", rom);
|
REGION_ALIAS("REGION_TEXT", rom);
|
||||||
REGION_ALIAS("REGION_DATA", ram);
|
REGION_ALIAS("REGION_DATA", ram);
|
||||||
REGION_ALIAS("REGION_BSS", ram);
|
REGION_ALIAS("REGION_BSS", ram);
|
||||||
REGION_ALIAS("REGION_RODATA", rom);
|
REGION_ALIAS("REGION_RODATA", rom);
|
||||||
|
|
||||||
/* Let common.inc handle the real work. */
|
/* Let common.inc handle the real work. */
|
||||||
INCLUDE common.inc
|
INCLUDE common.inc
|
|
@ -1,5 +1,5 @@
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 61K
|
ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 61K
|
||||||
rom (rx) : ORIGIN = 0x08005000, LENGTH = 492K
|
rom (rx) : ORIGIN = 0x08005000, LENGTH = 492K
|
||||||
}
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
|
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
|
||||||
rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K
|
rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K
|
||||||
}
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 61K
|
ram (rwx) : ORIGIN = 0x20000C00, LENGTH = 61K
|
||||||
rom (rx) : ORIGIN = 0x08005000, LENGTH = 0K
|
rom (rx) : ORIGIN = 0x08005000, LENGTH = 0K
|
||||||
}
|
}
|
|
@ -1,25 +1,25 @@
|
||||||
/*
|
/*
|
||||||
* libmaple linker script for RAM builds.
|
* libmaple linker script for RAM builds.
|
||||||
*
|
*
|
||||||
* A Flash build puts .text, .rodata, and .data/.bss/heap (of course)
|
* A Flash build puts .text, .rodata, and .data/.bss/heap (of course)
|
||||||
* in SRAM, but offsets the sections by enough space to store the
|
* in SRAM, but offsets the sections by enough space to store the
|
||||||
* Maple bootloader, which uses low memory.
|
* Maple bootloader, which uses low memory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This pulls in the appropriate MEMORY declaration from the right
|
* This pulls in the appropriate MEMORY declaration from the right
|
||||||
* subdirectory of stm32/mem/ (the environment must call ld with the
|
* subdirectory of stm32/mem/ (the environment must call ld with the
|
||||||
* right include directory flags to make this happen). Boards can also
|
* right include directory flags to make this happen). Boards can also
|
||||||
* use this file to use any of libmaple's memory-related hooks (like
|
* use this file to use any of libmaple's memory-related hooks (like
|
||||||
* where the heap should live).
|
* where the heap should live).
|
||||||
*/
|
*/
|
||||||
INCLUDE mem-ram.inc
|
INCLUDE mem-ram.inc
|
||||||
|
|
||||||
/* Provide memory region aliases for common.inc */
|
/* Provide memory region aliases for common.inc */
|
||||||
REGION_ALIAS("REGION_TEXT", ram);
|
REGION_ALIAS("REGION_TEXT", ram);
|
||||||
REGION_ALIAS("REGION_DATA", ram);
|
REGION_ALIAS("REGION_DATA", ram);
|
||||||
REGION_ALIAS("REGION_BSS", ram);
|
REGION_ALIAS("REGION_BSS", ram);
|
||||||
REGION_ALIAS("REGION_RODATA", ram);
|
REGION_ALIAS("REGION_RODATA", ram);
|
||||||
|
|
||||||
/* Let common.inc handle the real work. */
|
/* Let common.inc handle the real work. */
|
||||||
INCLUDE common.inc
|
INCLUDE common.inc
|
|
@ -1,78 +1,78 @@
|
||||||
EXTERN(__msp_init)
|
EXTERN(__msp_init)
|
||||||
EXTERN(__exc_reset)
|
EXTERN(__exc_reset)
|
||||||
EXTERN(__exc_nmi)
|
EXTERN(__exc_nmi)
|
||||||
EXTERN(__exc_hardfault)
|
EXTERN(__exc_hardfault)
|
||||||
EXTERN(__exc_memmanage)
|
EXTERN(__exc_memmanage)
|
||||||
EXTERN(__exc_busfault)
|
EXTERN(__exc_busfault)
|
||||||
EXTERN(__exc_usagefault)
|
EXTERN(__exc_usagefault)
|
||||||
EXTERN(__stm32reservedexception7)
|
EXTERN(__stm32reservedexception7)
|
||||||
EXTERN(__stm32reservedexception8)
|
EXTERN(__stm32reservedexception8)
|
||||||
EXTERN(__stm32reservedexception9)
|
EXTERN(__stm32reservedexception9)
|
||||||
EXTERN(__stm32reservedexception10)
|
EXTERN(__stm32reservedexception10)
|
||||||
EXTERN(__exc_svc)
|
EXTERN(__exc_svc)
|
||||||
EXTERN(__exc_debug_monitor)
|
EXTERN(__exc_debug_monitor)
|
||||||
EXTERN(__stm32reservedexception13)
|
EXTERN(__stm32reservedexception13)
|
||||||
EXTERN(__exc_pendsv)
|
EXTERN(__exc_pendsv)
|
||||||
EXTERN(__exc_systick)
|
EXTERN(__exc_systick)
|
||||||
|
|
||||||
EXTERN(__irq_wwdg)
|
EXTERN(__irq_wwdg)
|
||||||
EXTERN(__irq_pvd)
|
EXTERN(__irq_pvd)
|
||||||
EXTERN(__irq_tamper)
|
EXTERN(__irq_tamper)
|
||||||
EXTERN(__irq_rtc)
|
EXTERN(__irq_rtc)
|
||||||
EXTERN(__irq_flash)
|
EXTERN(__irq_flash)
|
||||||
EXTERN(__irq_rcc)
|
EXTERN(__irq_rcc)
|
||||||
EXTERN(__irq_exti0)
|
EXTERN(__irq_exti0)
|
||||||
EXTERN(__irq_exti1)
|
EXTERN(__irq_exti1)
|
||||||
EXTERN(__irq_exti2)
|
EXTERN(__irq_exti2)
|
||||||
EXTERN(__irq_exti3)
|
EXTERN(__irq_exti3)
|
||||||
EXTERN(__irq_exti4)
|
EXTERN(__irq_exti4)
|
||||||
EXTERN(__irq_dma1_channel1)
|
EXTERN(__irq_dma1_channel1)
|
||||||
EXTERN(__irq_dma1_channel2)
|
EXTERN(__irq_dma1_channel2)
|
||||||
EXTERN(__irq_dma1_channel3)
|
EXTERN(__irq_dma1_channel3)
|
||||||
EXTERN(__irq_dma1_channel4)
|
EXTERN(__irq_dma1_channel4)
|
||||||
EXTERN(__irq_dma1_channel5)
|
EXTERN(__irq_dma1_channel5)
|
||||||
EXTERN(__irq_dma1_channel6)
|
EXTERN(__irq_dma1_channel6)
|
||||||
EXTERN(__irq_dma1_channel7)
|
EXTERN(__irq_dma1_channel7)
|
||||||
EXTERN(__irq_adc)
|
EXTERN(__irq_adc)
|
||||||
EXTERN(__irq_usb_hp_can_tx)
|
EXTERN(__irq_usb_hp_can_tx)
|
||||||
EXTERN(__irq_usb_lp_can_rx0)
|
EXTERN(__irq_usb_lp_can_rx0)
|
||||||
EXTERN(__irq_can_rx1)
|
EXTERN(__irq_can_rx1)
|
||||||
EXTERN(__irq_can_sce)
|
EXTERN(__irq_can_sce)
|
||||||
EXTERN(__irq_exti9_5)
|
EXTERN(__irq_exti9_5)
|
||||||
EXTERN(__irq_tim1_brk)
|
EXTERN(__irq_tim1_brk)
|
||||||
EXTERN(__irq_tim1_up)
|
EXTERN(__irq_tim1_up)
|
||||||
EXTERN(__irq_tim1_trg_com)
|
EXTERN(__irq_tim1_trg_com)
|
||||||
EXTERN(__irq_tim1_cc)
|
EXTERN(__irq_tim1_cc)
|
||||||
EXTERN(__irq_tim2)
|
EXTERN(__irq_tim2)
|
||||||
EXTERN(__irq_tim3)
|
EXTERN(__irq_tim3)
|
||||||
EXTERN(__irq_tim4)
|
EXTERN(__irq_tim4)
|
||||||
EXTERN(__irq_i2c1_ev)
|
EXTERN(__irq_i2c1_ev)
|
||||||
EXTERN(__irq_i2c1_er)
|
EXTERN(__irq_i2c1_er)
|
||||||
EXTERN(__irq_i2c2_ev)
|
EXTERN(__irq_i2c2_ev)
|
||||||
EXTERN(__irq_i2c2_er)
|
EXTERN(__irq_i2c2_er)
|
||||||
EXTERN(__irq_spi1)
|
EXTERN(__irq_spi1)
|
||||||
EXTERN(__irq_spi2)
|
EXTERN(__irq_spi2)
|
||||||
EXTERN(__irq_usart1)
|
EXTERN(__irq_usart1)
|
||||||
EXTERN(__irq_usart2)
|
EXTERN(__irq_usart2)
|
||||||
EXTERN(__irq_usart3)
|
EXTERN(__irq_usart3)
|
||||||
EXTERN(__irq_exti15_10)
|
EXTERN(__irq_exti15_10)
|
||||||
EXTERN(__irq_rtcalarm)
|
EXTERN(__irq_rtcalarm)
|
||||||
EXTERN(__irq_usbwakeup)
|
EXTERN(__irq_usbwakeup)
|
||||||
|
|
||||||
EXTERN(__irq_tim8_brk)
|
EXTERN(__irq_tim8_brk)
|
||||||
EXTERN(__irq_tim8_up)
|
EXTERN(__irq_tim8_up)
|
||||||
EXTERN(__irq_tim8_trg_com)
|
EXTERN(__irq_tim8_trg_com)
|
||||||
EXTERN(__irq_tim8_cc)
|
EXTERN(__irq_tim8_cc)
|
||||||
EXTERN(__irq_adc3)
|
EXTERN(__irq_adc3)
|
||||||
EXTERN(__irq_fsmc)
|
EXTERN(__irq_fsmc)
|
||||||
EXTERN(__irq_sdio)
|
EXTERN(__irq_sdio)
|
||||||
EXTERN(__irq_tim5)
|
EXTERN(__irq_tim5)
|
||||||
EXTERN(__irq_spi3)
|
EXTERN(__irq_spi3)
|
||||||
EXTERN(__irq_uart4)
|
EXTERN(__irq_uart4)
|
||||||
EXTERN(__irq_uart5)
|
EXTERN(__irq_uart5)
|
||||||
EXTERN(__irq_tim6)
|
EXTERN(__irq_tim6)
|
||||||
EXTERN(__irq_tim7)
|
EXTERN(__irq_tim7)
|
||||||
EXTERN(__irq_dma2_channel1)
|
EXTERN(__irq_dma2_channel1)
|
||||||
EXTERN(__irq_dma2_channel2)
|
EXTERN(__irq_dma2_channel2)
|
||||||
EXTERN(__irq_dma2_channel3)
|
EXTERN(__irq_dma2_channel3)
|
||||||
EXTERN(__irq_dma2_channel4_5)
|
EXTERN(__irq_dma2_channel4_5)
|
|
@ -1,2 +1,2 @@
|
||||||
// API compatibility
|
// API compatibility
|
||||||
#include "variant.h"
|
#include "variant.h"
|
|
@ -1,13 +1,13 @@
|
||||||
#ifndef _VARIANT_ARDUINO_STM32_
|
#ifndef _VARIANT_ARDUINO_STM32_
|
||||||
#define _VARIANT_ARDUINO_STM32_
|
#define _VARIANT_ARDUINO_STM32_
|
||||||
|
|
||||||
#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device )
|
#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device )
|
||||||
#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) )
|
#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) )
|
||||||
#define portOutputRegister(port) ( &(port->regs->ODR) )
|
#define portOutputRegister(port) ( &(port->regs->ODR) )
|
||||||
#define portInputRegister(port) ( &(port->regs->IDR) )
|
#define portInputRegister(port) ( &(port->regs->IDR) )
|
||||||
|
|
||||||
#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) )
|
#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) )
|
||||||
#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) )
|
#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) )
|
||||||
|
|
||||||
#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) )
|
#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) )
|
||||||
#endif /* _VARIANT_ARDUINO_STM32_ */
|
#endif /* _VARIANT_ARDUINO_STM32_ */
|
|
@ -1,57 +1,57 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* The MIT License
|
* The MIT License
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011 LeafLabs, LLC.
|
* Copyright (c) 2011 LeafLabs, LLC.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person
|
* Permission is hereby granted, free of charge, to any person
|
||||||
* obtaining a copy of this software and associated documentation
|
* obtaining a copy of this software and associated documentation
|
||||||
* files (the "Software"), to deal in the Software without
|
* files (the "Software"), to deal in the Software without
|
||||||
* restriction, including without limitation the rights to use, copy,
|
* restriction, including without limitation the rights to use, copy,
|
||||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
* of the Software, and to permit persons to whom the Software is
|
* of the Software, and to permit persons to whom the Software is
|
||||||
* furnished to do so, subject to the following conditions:
|
* furnished to do so, subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be
|
* The above copyright notice and this permission notice shall be
|
||||||
* included in all copies or substantial portions of the Software.
|
* included in all copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file is a modified version of a file obtained from
|
* This file is a modified version of a file obtained from
|
||||||
* CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the
|
* CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the
|
||||||
* following text appeared:
|
* following text appeared:
|
||||||
*
|
*
|
||||||
* The authors hereby grant permission to use, copy, modify, distribute,
|
* The authors hereby grant permission to use, copy, modify, distribute,
|
||||||
* and license this software and its documentation for any purpose, provided
|
* and license this software and its documentation for any purpose, provided
|
||||||
* that existing copyright notices are retained in all copies and that this
|
* that existing copyright notices are retained in all copies and that this
|
||||||
* notice is included verbatim in any distributions. No written agreement,
|
* notice is included verbatim in any distributions. No written agreement,
|
||||||
* license, or royalty fee is required for any of the authorized uses.
|
* license, or royalty fee is required for any of the authorized uses.
|
||||||
* Modifications to this software may be copyrighted by their authors
|
* Modifications to this software may be copyrighted by their authors
|
||||||
* and need not follow the licensing terms described here, provided that
|
* and need not follow the licensing terms described here, provided that
|
||||||
* the new terms are clearly indicated on the first page of each file where
|
* the new terms are clearly indicated on the first page of each file where
|
||||||
* they apply.
|
* they apply.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.code 16
|
.code 16
|
||||||
.thumb_func
|
.thumb_func
|
||||||
|
|
||||||
.globl __start__
|
.globl __start__
|
||||||
.type __start__, %function
|
.type __start__, %function
|
||||||
__start__:
|
__start__:
|
||||||
.fnstart
|
.fnstart
|
||||||
ldr r1,=__msp_init
|
ldr r1,=__msp_init
|
||||||
mov sp,r1
|
mov sp,r1
|
||||||
ldr r1,=start_c
|
ldr r1,=start_c
|
||||||
bx r1
|
bx r1
|
||||||
.pool
|
.pool
|
||||||
.cantunwind
|
.cantunwind
|
||||||
.fnend
|
.fnend
|
|
@ -1,95 +1,95 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* The MIT License
|
* The MIT License
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011 LeafLabs, LLC.
|
* Copyright (c) 2011 LeafLabs, LLC.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person
|
* Permission is hereby granted, free of charge, to any person
|
||||||
* obtaining a copy of this software and associated documentation
|
* obtaining a copy of this software and associated documentation
|
||||||
* files (the "Software"), to deal in the Software without
|
* files (the "Software"), to deal in the Software without
|
||||||
* restriction, including without limitation the rights to use, copy,
|
* restriction, including without limitation the rights to use, copy,
|
||||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
* of the Software, and to permit persons to whom the Software is
|
* of the Software, and to permit persons to whom the Software is
|
||||||
* furnished to do so, subject to the following conditions:
|
* furnished to do so, subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be
|
* The above copyright notice and this permission notice shall be
|
||||||
* included in all copies or substantial portions of the Software.
|
* included in all copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file is a modified version of a file obtained from
|
* This file is a modified version of a file obtained from
|
||||||
* CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the
|
* CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the
|
||||||
* following text appeared:
|
* following text appeared:
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006, 2007 CodeSourcery Inc
|
* Copyright (c) 2006, 2007 CodeSourcery Inc
|
||||||
*
|
*
|
||||||
* The authors hereby grant permission to use, copy, modify, distribute,
|
* The authors hereby grant permission to use, copy, modify, distribute,
|
||||||
* and license this software and its documentation for any purpose, provided
|
* and license this software and its documentation for any purpose, provided
|
||||||
* that existing copyright notices are retained in all copies and that this
|
* that existing copyright notices are retained in all copies and that this
|
||||||
* notice is included verbatim in any distributions. No written agreement,
|
* notice is included verbatim in any distributions. No written agreement,
|
||||||
* license, or royalty fee is required for any of the authorized uses.
|
* license, or royalty fee is required for any of the authorized uses.
|
||||||
* Modifications to this software may be copyrighted by their authors
|
* Modifications to this software may be copyrighted by their authors
|
||||||
* and need not follow the licensing terms described here, provided that
|
* and need not follow the licensing terms described here, provided that
|
||||||
* the new terms are clearly indicated on the first page of each file where
|
* the new terms are clearly indicated on the first page of each file where
|
||||||
* they apply.
|
* they apply.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
extern void __libc_init_array(void);
|
extern void __libc_init_array(void);
|
||||||
|
|
||||||
extern int main(int, char**, char**);
|
extern int main(int, char**, char**);
|
||||||
|
|
||||||
extern void exit(int) __attribute__((noreturn, weak));
|
extern void exit(int) __attribute__((noreturn, weak));
|
||||||
|
|
||||||
/* The linker must ensure that these are at least 4-byte aligned. */
|
/* The linker must ensure that these are at least 4-byte aligned. */
|
||||||
extern char __data_start__, __data_end__;
|
extern char __data_start__, __data_end__;
|
||||||
extern char __bss_start__, __bss_end__;
|
extern char __bss_start__, __bss_end__;
|
||||||
|
|
||||||
struct rom_img_cfg {
|
struct rom_img_cfg {
|
||||||
int *img_start;
|
int *img_start;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern char _lm_rom_img_cfgp;
|
extern char _lm_rom_img_cfgp;
|
||||||
|
|
||||||
void __attribute__((noreturn)) start_c(void) {
|
void __attribute__((noreturn)) start_c(void) {
|
||||||
struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp;
|
struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp;
|
||||||
int *src = img_cfg->img_start;
|
int *src = img_cfg->img_start;
|
||||||
int *dst = (int*)&__data_start__;
|
int *dst = (int*)&__data_start__;
|
||||||
int exit_code;
|
int exit_code;
|
||||||
|
|
||||||
/* Initialize .data, if necessary. */
|
/* Initialize .data, if necessary. */
|
||||||
if (src != dst) {
|
if (src != dst) {
|
||||||
int *end = (int*)&__data_end__;
|
int *end = (int*)&__data_end__;
|
||||||
while (dst < end) {
|
while (dst < end) {
|
||||||
*dst++ = *src++;
|
*dst++ = *src++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Zero .bss. */
|
/* Zero .bss. */
|
||||||
dst = (int*)&__bss_start__;
|
dst = (int*)&__bss_start__;
|
||||||
while (dst < (int*)&__bss_end__) {
|
while (dst < (int*)&__bss_end__) {
|
||||||
*dst++ = 0;
|
*dst++ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Run initializers. */
|
/* Run initializers. */
|
||||||
__libc_init_array();
|
__libc_init_array();
|
||||||
|
|
||||||
/* Jump to main. */
|
/* Jump to main. */
|
||||||
exit_code = main(0, 0, 0);
|
exit_code = main(0, 0, 0);
|
||||||
if (exit) {
|
if (exit) {
|
||||||
exit(exit_code);
|
exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If exit is NULL, make sure we don't return. */
|
/* If exit is NULL, make sure we don't return. */
|
||||||
for (;;)
|
for (;;)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
|
@ -1,176 +1,176 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* The MIT License
|
* The MIT License
|
||||||
*
|
*
|
||||||
* Copyright (c) 2010 Perry Hung.
|
* Copyright (c) 2010 Perry Hung.
|
||||||
* Copyright (c) 2011, 2012 LeafLabs, LLC.
|
* Copyright (c) 2011, 2012 LeafLabs, LLC.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person
|
* Permission is hereby granted, free of charge, to any person
|
||||||
* obtaining a copy of this software and associated documentation
|
* obtaining a copy of this software and associated documentation
|
||||||
* files (the "Software"), to deal in the Software without
|
* files (the "Software"), to deal in the Software without
|
||||||
* restriction, including without limitation the rights to use, copy,
|
* restriction, including without limitation the rights to use, copy,
|
||||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
* of the Software, and to permit persons to whom the Software is
|
* of the Software, and to permit persons to whom the Software is
|
||||||
* furnished to do so, subject to the following conditions:
|
* furnished to do so, subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be
|
* The above copyright notice and this permission notice shall be
|
||||||
* included in all copies or substantial portions of the Software.
|
* included in all copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file wirish/syscalls.c
|
* @file wirish/syscalls.c
|
||||||
* @brief newlib stubs
|
* @brief newlib stubs
|
||||||
*
|
*
|
||||||
* Low level system routines used by newlib for basic I/O and memory
|
* Low level system routines used by newlib for basic I/O and memory
|
||||||
* allocation. You can override most of these.
|
* allocation. You can override most of these.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libmaple/libmaple.h>
|
#include <libmaple/libmaple.h>
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
/* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then
|
/* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then
|
||||||
* assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by
|
* assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by
|
||||||
* the linker */
|
* the linker */
|
||||||
#ifndef CONFIG_HEAP_START
|
#ifndef CONFIG_HEAP_START
|
||||||
extern char _lm_heap_start;
|
extern char _lm_heap_start;
|
||||||
#define CONFIG_HEAP_START ((void *)&_lm_heap_start)
|
#define CONFIG_HEAP_START ((void *)&_lm_heap_start)
|
||||||
#endif
|
#endif
|
||||||
#ifndef CONFIG_HEAP_END
|
#ifndef CONFIG_HEAP_END
|
||||||
extern char _lm_heap_end;
|
extern char _lm_heap_end;
|
||||||
#define CONFIG_HEAP_END ((void *)&_lm_heap_end)
|
#define CONFIG_HEAP_END ((void *)&_lm_heap_end)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* _sbrk -- Increment the program break.
|
* _sbrk -- Increment the program break.
|
||||||
*
|
*
|
||||||
* Get incr bytes more RAM (for use by the heap). malloc() and
|
* Get incr bytes more RAM (for use by the heap). malloc() and
|
||||||
* friends call this function behind the scenes.
|
* friends call this function behind the scenes.
|
||||||
*/
|
*/
|
||||||
void *_sbrk(int incr) {
|
void *_sbrk(int incr) {
|
||||||
static void * pbreak = NULL; /* current program break */
|
static void * pbreak = NULL; /* current program break */
|
||||||
void * ret;
|
void * ret;
|
||||||
|
|
||||||
if (pbreak == NULL) {
|
if (pbreak == NULL) {
|
||||||
pbreak = CONFIG_HEAP_START;
|
pbreak = CONFIG_HEAP_START;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((CONFIG_HEAP_END - pbreak < incr) ||
|
if ((CONFIG_HEAP_END - pbreak < incr) ||
|
||||||
(pbreak - CONFIG_HEAP_START < -incr)) {
|
(pbreak - CONFIG_HEAP_START < -incr)) {
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return (void *)-1;
|
return (void *)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = pbreak;
|
ret = pbreak;
|
||||||
pbreak += incr;
|
pbreak += incr;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int _open(const char *path, int flags, ...) {
|
__weak int _open(const char *path, int flags, ...) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int _close(int fd) {
|
__weak int _close(int fd) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int _fstat(int fd, struct stat *st) {
|
__weak int _fstat(int fd, struct stat *st) {
|
||||||
st->st_mode = S_IFCHR;
|
st->st_mode = S_IFCHR;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int _isatty(int fd) {
|
__weak int _isatty(int fd) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int isatty(int fd) {
|
__weak int isatty(int fd) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int _lseek(int fd, off_t pos, int whence) {
|
__weak int _lseek(int fd, off_t pos, int whence) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak unsigned char getch(void) {
|
__weak unsigned char getch(void) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
__weak int _read(int fd, char *buf, size_t cnt) {
|
__weak int _read(int fd, char *buf, size_t cnt) {
|
||||||
*buf = getch();
|
*buf = getch();
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak void putch(unsigned char c) {
|
__weak void putch(unsigned char c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak void cgets(char *s, int bufsize) {
|
__weak void cgets(char *s, int bufsize) {
|
||||||
char *p;
|
char *p;
|
||||||
int c;
|
int c;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < bufsize; i++) {
|
for (i = 0; i < bufsize; i++) {
|
||||||
*(s+i) = 0;
|
*(s+i) = 0;
|
||||||
}
|
}
|
||||||
// memset(s, 0, bufsize);
|
// memset(s, 0, bufsize);
|
||||||
|
|
||||||
p = s;
|
p = s;
|
||||||
|
|
||||||
for (p = s; p < s + bufsize-1;) {
|
for (p = s; p < s + bufsize-1;) {
|
||||||
c = getch();
|
c = getch();
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '\r' :
|
case '\r' :
|
||||||
case '\n' :
|
case '\n' :
|
||||||
putch('\r');
|
putch('\r');
|
||||||
putch('\n');
|
putch('\n');
|
||||||
*p = '\n';
|
*p = '\n';
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case '\b' :
|
case '\b' :
|
||||||
if (p > s) {
|
if (p > s) {
|
||||||
*p-- = 0;
|
*p-- = 0;
|
||||||
putch('\b');
|
putch('\b');
|
||||||
putch(' ');
|
putch(' ');
|
||||||
putch('\b');
|
putch('\b');
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default :
|
default :
|
||||||
putch(c);
|
putch(c);
|
||||||
*p++ = c;
|
*p++ = c;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int _write(int fd, const char *buf, size_t cnt) {
|
__weak int _write(int fd, const char *buf, size_t cnt) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < cnt; i++)
|
for (i = 0; i < cnt; i++)
|
||||||
putch(buf[i]);
|
putch(buf[i]);
|
||||||
|
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Override fgets() in newlib with a version that does line editing */
|
/* Override fgets() in newlib with a version that does line editing */
|
||||||
__weak char *fgets(char *s, int bufsize, void *f) {
|
__weak char *fgets(char *s, int bufsize, void *f) {
|
||||||
cgets(s, bufsize);
|
cgets(s, bufsize);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak void _exit(int exitcode) {
|
__weak void _exit(int exitcode) {
|
||||||
while (1)
|
while (1)
|
||||||
;
|
;
|
||||||
}
|
}
|
|
@ -1,220 +1,220 @@
|
||||||
/*
|
/*
|
||||||
* Linker script for libmaple.
|
* Linker script for libmaple.
|
||||||
*
|
*
|
||||||
* Original author "lanchon" from ST forums, with modifications by LeafLabs.
|
* Original author "lanchon" from ST forums, with modifications by LeafLabs.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configure other libraries we want in the link.
|
* Configure other libraries we want in the link.
|
||||||
*
|
*
|
||||||
* libgcc, libc, and libm are common across supported toolchains.
|
* libgcc, libc, and libm are common across supported toolchains.
|
||||||
* However, some toolchains require additional archives which aren't
|
* However, some toolchains require additional archives which aren't
|
||||||
* present everywhere (e.g. ARM's gcc-arm-embedded releases).
|
* present everywhere (e.g. ARM's gcc-arm-embedded releases).
|
||||||
*
|
*
|
||||||
* To hack around this, we let the build system specify additional
|
* To hack around this, we let the build system specify additional
|
||||||
* archives by putting the right extra_libs.inc (in a directory under
|
* archives by putting the right extra_libs.inc (in a directory under
|
||||||
* toolchains/) in our search path.
|
* toolchains/) in our search path.
|
||||||
*/
|
*/
|
||||||
GROUP(libgcc.a libc.a libm.a)
|
GROUP(libgcc.a libc.a libm.a)
|
||||||
INCLUDE extra_libs.inc
|
INCLUDE extra_libs.inc
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These force the linker to search for vector table symbols.
|
* These force the linker to search for vector table symbols.
|
||||||
*
|
*
|
||||||
* These symbols vary by STM32 family (and also within families).
|
* These symbols vary by STM32 family (and also within families).
|
||||||
* It's up to the build system to configure the link's search path
|
* It's up to the build system to configure the link's search path
|
||||||
* properly for the target MCU.
|
* properly for the target MCU.
|
||||||
*/
|
*/
|
||||||
INCLUDE vector_symbols.inc
|
INCLUDE vector_symbols.inc
|
||||||
|
|
||||||
/* STM32 vector table. */
|
/* STM32 vector table. */
|
||||||
EXTERN(__stm32_vector_table)
|
EXTERN(__stm32_vector_table)
|
||||||
|
|
||||||
/* C runtime initialization function. */
|
/* C runtime initialization function. */
|
||||||
EXTERN(start_c)
|
EXTERN(start_c)
|
||||||
|
|
||||||
/* main entry point */
|
/* main entry point */
|
||||||
EXTERN(main)
|
EXTERN(main)
|
||||||
|
|
||||||
/* Initial stack pointer value. */
|
/* Initial stack pointer value. */
|
||||||
EXTERN(__msp_init)
|
EXTERN(__msp_init)
|
||||||
PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram));
|
PROVIDE(__msp_init = ORIGIN(ram) + LENGTH(ram));
|
||||||
|
|
||||||
/* Reset vector and chip reset entry point */
|
/* Reset vector and chip reset entry point */
|
||||||
EXTERN(__start__)
|
EXTERN(__start__)
|
||||||
ENTRY(__start__)
|
ENTRY(__start__)
|
||||||
PROVIDE(__exc_reset = __start__);
|
PROVIDE(__exc_reset = __start__);
|
||||||
|
|
||||||
/* Heap boundaries, for libmaple */
|
/* Heap boundaries, for libmaple */
|
||||||
EXTERN(_lm_heap_start);
|
EXTERN(_lm_heap_start);
|
||||||
EXTERN(_lm_heap_end);
|
EXTERN(_lm_heap_end);
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
.text :
|
.text :
|
||||||
{
|
{
|
||||||
__text_start__ = .;
|
__text_start__ = .;
|
||||||
/*
|
/*
|
||||||
* STM32 vector table. Leave this here. Yes, really.
|
* STM32 vector table. Leave this here. Yes, really.
|
||||||
*/
|
*/
|
||||||
*(.stm32.interrupt_vector)
|
*(.stm32.interrupt_vector)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Program code and vague linking
|
* Program code and vague linking
|
||||||
*/
|
*/
|
||||||
*(.text .text.* .gnu.linkonce.t.*)
|
*(.text .text.* .gnu.linkonce.t.*)
|
||||||
*(.plt)
|
*(.plt)
|
||||||
*(.gnu.warning)
|
*(.gnu.warning)
|
||||||
*(.glue_7t) *(.glue_7) *(.vfp11_veneer)
|
*(.glue_7t) *(.glue_7) *(.vfp11_veneer)
|
||||||
|
|
||||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||||
*(.gcc_except_table)
|
*(.gcc_except_table)
|
||||||
*(.eh_frame_hdr)
|
*(.eh_frame_hdr)
|
||||||
*(.eh_frame)
|
*(.eh_frame)
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
KEEP(*(.init))
|
KEEP(*(.init))
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__preinit_array_start = .;
|
__preinit_array_start = .;
|
||||||
KEEP (*(.preinit_array))
|
KEEP (*(.preinit_array))
|
||||||
__preinit_array_end = .;
|
__preinit_array_end = .;
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__init_array_start = .;
|
__init_array_start = .;
|
||||||
KEEP (*(SORT(.init_array.*)))
|
KEEP (*(SORT(.init_array.*)))
|
||||||
KEEP (*(.init_array))
|
KEEP (*(.init_array))
|
||||||
__init_array_end = .;
|
__init_array_end = .;
|
||||||
|
|
||||||
. = ALIGN(0x4);
|
. = ALIGN(0x4);
|
||||||
KEEP (*crtbegin.o(.ctors))
|
KEEP (*crtbegin.o(.ctors))
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
|
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
|
||||||
KEEP (*(SORT(.ctors.*)))
|
KEEP (*(SORT(.ctors.*)))
|
||||||
KEEP (*crtend.o(.ctors))
|
KEEP (*crtend.o(.ctors))
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
KEEP(*(.fini))
|
KEEP(*(.fini))
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
__fini_array_start = .;
|
__fini_array_start = .;
|
||||||
KEEP (*(.fini_array))
|
KEEP (*(.fini_array))
|
||||||
KEEP (*(SORT(.fini_array.*)))
|
KEEP (*(SORT(.fini_array.*)))
|
||||||
__fini_array_end = .;
|
__fini_array_end = .;
|
||||||
|
|
||||||
KEEP (*crtbegin.o(.dtors))
|
KEEP (*crtbegin.o(.dtors))
|
||||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
|
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
|
||||||
KEEP (*(SORT(.dtors.*)))
|
KEEP (*(SORT(.dtors.*)))
|
||||||
KEEP (*crtend.o(.dtors))
|
KEEP (*crtend.o(.dtors))
|
||||||
} > REGION_TEXT
|
} > REGION_TEXT
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* End of text
|
* End of text
|
||||||
*/
|
*/
|
||||||
.text.align :
|
.text.align :
|
||||||
{
|
{
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
__text_end__ = .;
|
__text_end__ = .;
|
||||||
} > REGION_TEXT
|
} > REGION_TEXT
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* .ARM.exidx exception unwinding; mandated by ARM's C++ ABI
|
* .ARM.exidx exception unwinding; mandated by ARM's C++ ABI
|
||||||
*/
|
*/
|
||||||
__exidx_start = .;
|
__exidx_start = .;
|
||||||
.ARM.exidx :
|
.ARM.exidx :
|
||||||
{
|
{
|
||||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||||
} > REGION_RODATA
|
} > REGION_RODATA
|
||||||
__exidx_end = .;
|
__exidx_end = .;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* .data
|
* .data
|
||||||
*/
|
*/
|
||||||
.data :
|
.data :
|
||||||
{
|
{
|
||||||
__data_start__ = .;
|
__data_start__ = .;
|
||||||
LONG(0)
|
LONG(0)
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
|
|
||||||
*(.got.plt) *(.got)
|
*(.got.plt) *(.got)
|
||||||
*(.data .data.* .gnu.linkonce.d.*)
|
*(.data .data.* .gnu.linkonce.d.*)
|
||||||
|
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
__data_end__ = .;
|
__data_end__ = .;
|
||||||
} > REGION_DATA AT> REGION_RODATA
|
} > REGION_DATA AT> REGION_RODATA
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read-only data
|
* Read-only data
|
||||||
*/
|
*/
|
||||||
.rodata :
|
.rodata :
|
||||||
{
|
{
|
||||||
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
||||||
/* .USER_FLASH: We allow users to allocate into Flash here */
|
/* .USER_FLASH: We allow users to allocate into Flash here */
|
||||||
*(.USER_FLASH)
|
*(.USER_FLASH)
|
||||||
/* ROM image configuration; for C startup */
|
/* ROM image configuration; for C startup */
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
_lm_rom_img_cfgp = .;
|
_lm_rom_img_cfgp = .;
|
||||||
LONG(LOADADDR(.data));
|
LONG(LOADADDR(.data));
|
||||||
/*
|
/*
|
||||||
* Heap: Linker scripts may choose a custom heap by overriding
|
* Heap: Linker scripts may choose a custom heap by overriding
|
||||||
* _lm_heap_start and _lm_heap_end. Otherwise, the heap is in
|
* _lm_heap_start and _lm_heap_end. Otherwise, the heap is in
|
||||||
* internal SRAM, beginning after .bss, and growing towards
|
* internal SRAM, beginning after .bss, and growing towards
|
||||||
* the stack.
|
* the stack.
|
||||||
*
|
*
|
||||||
* I'm shoving these here naively; there's probably a cleaner way
|
* I'm shoving these here naively; there's probably a cleaner way
|
||||||
* to go about this. [mbolivar]
|
* to go about this. [mbolivar]
|
||||||
*/
|
*/
|
||||||
_lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end;
|
_lm_heap_start = DEFINED(_lm_heap_start) ? _lm_heap_start : _end;
|
||||||
_lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init;
|
_lm_heap_end = DEFINED(_lm_heap_end) ? _lm_heap_end : __msp_init;
|
||||||
} > REGION_RODATA
|
} > REGION_RODATA
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* .bss
|
* .bss
|
||||||
*/
|
*/
|
||||||
.bss :
|
.bss :
|
||||||
{
|
{
|
||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
__bss_start__ = .;
|
__bss_start__ = .;
|
||||||
*(.bss .bss.* .gnu.linkonce.b.*)
|
*(.bss .bss.* .gnu.linkonce.b.*)
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
. = ALIGN (8);
|
. = ALIGN (8);
|
||||||
__bss_end__ = .;
|
__bss_end__ = .;
|
||||||
_end = __bss_end__;
|
_end = __bss_end__;
|
||||||
} > REGION_BSS
|
} > REGION_BSS
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Debugging sections
|
* Debugging sections
|
||||||
*/
|
*/
|
||||||
.stab 0 (NOLOAD) : { *(.stab) }
|
.stab 0 (NOLOAD) : { *(.stab) }
|
||||||
.stabstr 0 (NOLOAD) : { *(.stabstr) }
|
.stabstr 0 (NOLOAD) : { *(.stabstr) }
|
||||||
/* DWARF debug sections.
|
/* DWARF debug sections.
|
||||||
* Symbols in the DWARF debugging sections are relative to the beginning
|
* Symbols in the DWARF debugging sections are relative to the beginning
|
||||||
* of the section so we begin them at 0. */
|
* of the section so we begin them at 0. */
|
||||||
/* DWARF 1 */
|
/* DWARF 1 */
|
||||||
.debug 0 : { *(.debug) }
|
.debug 0 : { *(.debug) }
|
||||||
.line 0 : { *(.line) }
|
.line 0 : { *(.line) }
|
||||||
/* GNU DWARF 1 extensions */
|
/* GNU DWARF 1 extensions */
|
||||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||||
/* DWARF 1.1 and DWARF 2 */
|
/* DWARF 1.1 and DWARF 2 */
|
||||||
.debug_aranges 0 : { *(.debug_aranges) }
|
.debug_aranges 0 : { *(.debug_aranges) }
|
||||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||||
/* DWARF 2 */
|
/* DWARF 2 */
|
||||||
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
||||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||||
.debug_line 0 : { *(.debug_line) }
|
.debug_line 0 : { *(.debug_line) }
|
||||||
.debug_frame 0 : { *(.debug_frame) }
|
.debug_frame 0 : { *(.debug_frame) }
|
||||||
.debug_str 0 : { *(.debug_str) }
|
.debug_str 0 : { *(.debug_str) }
|
||||||
.debug_loc 0 : { *(.debug_loc) }
|
.debug_loc 0 : { *(.debug_loc) }
|
||||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||||
/* SGI/MIPS DWARF 2 extensions */
|
/* SGI/MIPS DWARF 2 extensions */
|
||||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
.debug_weaknames 0 : { *(.debug_weaknames) }
|
||||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
.debug_funcnames 0 : { *(.debug_funcnames) }
|
||||||
.debug_typenames 0 : { *(.debug_typenames) }
|
.debug_typenames 0 : { *(.debug_typenames) }
|
||||||
.debug_varnames 0 : { *(.debug_varnames) }
|
.debug_varnames 0 : { *(.debug_varnames) }
|
||||||
|
|
||||||
.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
|
.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
|
||||||
.ARM.attributes 0 : { KEEP (*(.ARM.attributes)) }
|
.ARM.attributes 0 : { KEEP (*(.ARM.attributes)) }
|
||||||
/DISCARD/ : { *(.note.GNU-stack) }
|
/DISCARD/ : { *(.note.GNU-stack) }
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi-
|
* Extra archives needed by ARM's GCC ARM Embedded arm-none-eabi-
|
||||||
* releases (https://launchpad.net/gcc-arm-embedded/).
|
* releases (https://launchpad.net/gcc-arm-embedded/).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* This is for the provided newlib. */
|
/* This is for the provided newlib. */
|
||||||
GROUP(libnosys.a)
|
GROUP(libnosys.a)
|
|
@ -1,78 +1,78 @@
|
||||||
EXTERN(__msp_init)
|
EXTERN(__msp_init)
|
||||||
EXTERN(__exc_reset)
|
EXTERN(__exc_reset)
|
||||||
EXTERN(__exc_nmi)
|
EXTERN(__exc_nmi)
|
||||||
EXTERN(__exc_hardfault)
|
EXTERN(__exc_hardfault)
|
||||||
EXTERN(__exc_memmanage)
|
EXTERN(__exc_memmanage)
|
||||||
EXTERN(__exc_busfault)
|
EXTERN(__exc_busfault)
|
||||||
EXTERN(__exc_usagefault)
|
EXTERN(__exc_usagefault)
|
||||||
EXTERN(__stm32reservedexception7)
|
EXTERN(__stm32reservedexception7)
|
||||||
EXTERN(__stm32reservedexception8)
|
EXTERN(__stm32reservedexception8)
|
||||||
EXTERN(__stm32reservedexception9)
|
EXTERN(__stm32reservedexception9)
|
||||||
EXTERN(__stm32reservedexception10)
|
EXTERN(__stm32reservedexception10)
|
||||||
EXTERN(__exc_svc)
|
EXTERN(__exc_svc)
|
||||||
EXTERN(__exc_debug_monitor)
|
EXTERN(__exc_debug_monitor)
|
||||||
EXTERN(__stm32reservedexception13)
|
EXTERN(__stm32reservedexception13)
|
||||||
EXTERN(__exc_pendsv)
|
EXTERN(__exc_pendsv)
|
||||||
EXTERN(__exc_systick)
|
EXTERN(__exc_systick)
|
||||||
|
|
||||||
EXTERN(__irq_wwdg)
|
EXTERN(__irq_wwdg)
|
||||||
EXTERN(__irq_pvd)
|
EXTERN(__irq_pvd)
|
||||||
EXTERN(__irq_tamper)
|
EXTERN(__irq_tamper)
|
||||||
EXTERN(__irq_rtc)
|
EXTERN(__irq_rtc)
|
||||||
EXTERN(__irq_flash)
|
EXTERN(__irq_flash)
|
||||||
EXTERN(__irq_rcc)
|
EXTERN(__irq_rcc)
|
||||||
EXTERN(__irq_exti0)
|
EXTERN(__irq_exti0)
|
||||||
EXTERN(__irq_exti1)
|
EXTERN(__irq_exti1)
|
||||||
EXTERN(__irq_exti2)
|
EXTERN(__irq_exti2)
|
||||||
EXTERN(__irq_exti3)
|
EXTERN(__irq_exti3)
|
||||||
EXTERN(__irq_exti4)
|
EXTERN(__irq_exti4)
|
||||||
EXTERN(__irq_dma1_channel1)
|
EXTERN(__irq_dma1_channel1)
|
||||||
EXTERN(__irq_dma1_channel2)
|
EXTERN(__irq_dma1_channel2)
|
||||||
EXTERN(__irq_dma1_channel3)
|
EXTERN(__irq_dma1_channel3)
|
||||||
EXTERN(__irq_dma1_channel4)
|
EXTERN(__irq_dma1_channel4)
|
||||||
EXTERN(__irq_dma1_channel5)
|
EXTERN(__irq_dma1_channel5)
|
||||||
EXTERN(__irq_dma1_channel6)
|
EXTERN(__irq_dma1_channel6)
|
||||||
EXTERN(__irq_dma1_channel7)
|
EXTERN(__irq_dma1_channel7)
|
||||||
EXTERN(__irq_adc)
|
EXTERN(__irq_adc)
|
||||||
EXTERN(__irq_usb_hp_can_tx)
|
EXTERN(__irq_usb_hp_can_tx)
|
||||||
EXTERN(__irq_usb_lp_can_rx0)
|
EXTERN(__irq_usb_lp_can_rx0)
|
||||||
EXTERN(__irq_can_rx1)
|
EXTERN(__irq_can_rx1)
|
||||||
EXTERN(__irq_can_sce)
|
EXTERN(__irq_can_sce)
|
||||||
EXTERN(__irq_exti9_5)
|
EXTERN(__irq_exti9_5)
|
||||||
EXTERN(__irq_tim1_brk)
|
EXTERN(__irq_tim1_brk)
|
||||||
EXTERN(__irq_tim1_up)
|
EXTERN(__irq_tim1_up)
|
||||||
EXTERN(__irq_tim1_trg_com)
|
EXTERN(__irq_tim1_trg_com)
|
||||||
EXTERN(__irq_tim1_cc)
|
EXTERN(__irq_tim1_cc)
|
||||||
EXTERN(__irq_tim2)
|
EXTERN(__irq_tim2)
|
||||||
EXTERN(__irq_tim3)
|
EXTERN(__irq_tim3)
|
||||||
EXTERN(__irq_tim4)
|
EXTERN(__irq_tim4)
|
||||||
EXTERN(__irq_i2c1_ev)
|
EXTERN(__irq_i2c1_ev)
|
||||||
EXTERN(__irq_i2c1_er)
|
EXTERN(__irq_i2c1_er)
|
||||||
EXTERN(__irq_i2c2_ev)
|
EXTERN(__irq_i2c2_ev)
|
||||||
EXTERN(__irq_i2c2_er)
|
EXTERN(__irq_i2c2_er)
|
||||||
EXTERN(__irq_spi1)
|
EXTERN(__irq_spi1)
|
||||||
EXTERN(__irq_spi2)
|
EXTERN(__irq_spi2)
|
||||||
EXTERN(__irq_usart1)
|
EXTERN(__irq_usart1)
|
||||||
EXTERN(__irq_usart2)
|
EXTERN(__irq_usart2)
|
||||||
EXTERN(__irq_usart3)
|
EXTERN(__irq_usart3)
|
||||||
EXTERN(__irq_exti15_10)
|
EXTERN(__irq_exti15_10)
|
||||||
EXTERN(__irq_rtcalarm)
|
EXTERN(__irq_rtcalarm)
|
||||||
EXTERN(__irq_usbwakeup)
|
EXTERN(__irq_usbwakeup)
|
||||||
|
|
||||||
EXTERN(__irq_tim8_brk)
|
EXTERN(__irq_tim8_brk)
|
||||||
EXTERN(__irq_tim8_up)
|
EXTERN(__irq_tim8_up)
|
||||||
EXTERN(__irq_tim8_trg_com)
|
EXTERN(__irq_tim8_trg_com)
|
||||||
EXTERN(__irq_tim8_cc)
|
EXTERN(__irq_tim8_cc)
|
||||||
EXTERN(__irq_adc3)
|
EXTERN(__irq_adc3)
|
||||||
EXTERN(__irq_fsmc)
|
EXTERN(__irq_fsmc)
|
||||||
EXTERN(__irq_sdio)
|
EXTERN(__irq_sdio)
|
||||||
EXTERN(__irq_tim5)
|
EXTERN(__irq_tim5)
|
||||||
EXTERN(__irq_spi3)
|
EXTERN(__irq_spi3)
|
||||||
EXTERN(__irq_uart4)
|
EXTERN(__irq_uart4)
|
||||||
EXTERN(__irq_uart5)
|
EXTERN(__irq_uart5)
|
||||||
EXTERN(__irq_tim6)
|
EXTERN(__irq_tim6)
|
||||||
EXTERN(__irq_tim7)
|
EXTERN(__irq_tim7)
|
||||||
EXTERN(__irq_dma2_channel1)
|
EXTERN(__irq_dma2_channel1)
|
||||||
EXTERN(__irq_dma2_channel2)
|
EXTERN(__irq_dma2_channel2)
|
||||||
EXTERN(__irq_dma2_channel3)
|
EXTERN(__irq_dma2_channel3)
|
||||||
EXTERN(__irq_dma2_channel4_5)
|
EXTERN(__irq_dma2_channel4_5)
|
|
@ -1,2 +1,2 @@
|
||||||
// API compatibility
|
// API compatibility
|
||||||
#include "variant.h"
|
#include "variant.h"
|
|
@ -1,13 +1,13 @@
|
||||||
#ifndef _VARIANT_ARDUINO_STM32_
|
#ifndef _VARIANT_ARDUINO_STM32_
|
||||||
#define _VARIANT_ARDUINO_STM32_
|
#define _VARIANT_ARDUINO_STM32_
|
||||||
|
|
||||||
#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device )
|
#define digitalPinToPort(P) ( PIN_MAP[P].gpio_device )
|
||||||
#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) )
|
#define digitalPinToBitMask(P) ( BIT(PIN_MAP[P].gpio_bit) )
|
||||||
#define portOutputRegister(port) ( &(port->regs->ODR) )
|
#define portOutputRegister(port) ( &(port->regs->ODR) )
|
||||||
#define portInputRegister(port) ( &(port->regs->IDR) )
|
#define portInputRegister(port) ( &(port->regs->IDR) )
|
||||||
|
|
||||||
#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) )
|
#define portSetRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BSRR) )
|
||||||
#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) )
|
#define portClearRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->BRR) )
|
||||||
|
|
||||||
#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) )
|
#define portConfigRegister(pin) ( &(PIN_MAP[pin].gpio_device->regs->CRL) )
|
||||||
#endif /* _VARIANT_ARDUINO_STM32_ */
|
#endif /* _VARIANT_ARDUINO_STM32_ */
|
|
@ -1,57 +1,57 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* The MIT License
|
* The MIT License
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011 LeafLabs, LLC.
|
* Copyright (c) 2011 LeafLabs, LLC.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person
|
* Permission is hereby granted, free of charge, to any person
|
||||||
* obtaining a copy of this software and associated documentation
|
* obtaining a copy of this software and associated documentation
|
||||||
* files (the "Software"), to deal in the Software without
|
* files (the "Software"), to deal in the Software without
|
||||||
* restriction, including without limitation the rights to use, copy,
|
* restriction, including without limitation the rights to use, copy,
|
||||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
* of the Software, and to permit persons to whom the Software is
|
* of the Software, and to permit persons to whom the Software is
|
||||||
* furnished to do so, subject to the following conditions:
|
* furnished to do so, subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be
|
* The above copyright notice and this permission notice shall be
|
||||||
* included in all copies or substantial portions of the Software.
|
* included in all copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file is a modified version of a file obtained from
|
* This file is a modified version of a file obtained from
|
||||||
* CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the
|
* CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the
|
||||||
* following text appeared:
|
* following text appeared:
|
||||||
*
|
*
|
||||||
* The authors hereby grant permission to use, copy, modify, distribute,
|
* The authors hereby grant permission to use, copy, modify, distribute,
|
||||||
* and license this software and its documentation for any purpose, provided
|
* and license this software and its documentation for any purpose, provided
|
||||||
* that existing copyright notices are retained in all copies and that this
|
* that existing copyright notices are retained in all copies and that this
|
||||||
* notice is included verbatim in any distributions. No written agreement,
|
* notice is included verbatim in any distributions. No written agreement,
|
||||||
* license, or royalty fee is required for any of the authorized uses.
|
* license, or royalty fee is required for any of the authorized uses.
|
||||||
* Modifications to this software may be copyrighted by their authors
|
* Modifications to this software may be copyrighted by their authors
|
||||||
* and need not follow the licensing terms described here, provided that
|
* and need not follow the licensing terms described here, provided that
|
||||||
* the new terms are clearly indicated on the first page of each file where
|
* the new terms are clearly indicated on the first page of each file where
|
||||||
* they apply.
|
* they apply.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.code 16
|
.code 16
|
||||||
.thumb_func
|
.thumb_func
|
||||||
|
|
||||||
.globl __start__
|
.globl __start__
|
||||||
.type __start__, %function
|
.type __start__, %function
|
||||||
__start__:
|
__start__:
|
||||||
.fnstart
|
.fnstart
|
||||||
ldr r1,=__msp_init
|
ldr r1,=__msp_init
|
||||||
mov sp,r1
|
mov sp,r1
|
||||||
ldr r1,=start_c
|
ldr r1,=start_c
|
||||||
bx r1
|
bx r1
|
||||||
.pool
|
.pool
|
||||||
.cantunwind
|
.cantunwind
|
||||||
.fnend
|
.fnend
|
|
@ -1,95 +1,95 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* The MIT License
|
* The MIT License
|
||||||
*
|
*
|
||||||
* Copyright (c) 2011 LeafLabs, LLC.
|
* Copyright (c) 2011 LeafLabs, LLC.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person
|
* Permission is hereby granted, free of charge, to any person
|
||||||
* obtaining a copy of this software and associated documentation
|
* obtaining a copy of this software and associated documentation
|
||||||
* files (the "Software"), to deal in the Software without
|
* files (the "Software"), to deal in the Software without
|
||||||
* restriction, including without limitation the rights to use, copy,
|
* restriction, including without limitation the rights to use, copy,
|
||||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
* of the Software, and to permit persons to whom the Software is
|
* of the Software, and to permit persons to whom the Software is
|
||||||
* furnished to do so, subject to the following conditions:
|
* furnished to do so, subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be
|
* The above copyright notice and this permission notice shall be
|
||||||
* included in all copies or substantial portions of the Software.
|
* included in all copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file is a modified version of a file obtained from
|
* This file is a modified version of a file obtained from
|
||||||
* CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the
|
* CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the
|
||||||
* following text appeared:
|
* following text appeared:
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006, 2007 CodeSourcery Inc
|
* Copyright (c) 2006, 2007 CodeSourcery Inc
|
||||||
*
|
*
|
||||||
* The authors hereby grant permission to use, copy, modify, distribute,
|
* The authors hereby grant permission to use, copy, modify, distribute,
|
||||||
* and license this software and its documentation for any purpose, provided
|
* and license this software and its documentation for any purpose, provided
|
||||||
* that existing copyright notices are retained in all copies and that this
|
* that existing copyright notices are retained in all copies and that this
|
||||||
* notice is included verbatim in any distributions. No written agreement,
|
* notice is included verbatim in any distributions. No written agreement,
|
||||||
* license, or royalty fee is required for any of the authorized uses.
|
* license, or royalty fee is required for any of the authorized uses.
|
||||||
* Modifications to this software may be copyrighted by their authors
|
* Modifications to this software may be copyrighted by their authors
|
||||||
* and need not follow the licensing terms described here, provided that
|
* and need not follow the licensing terms described here, provided that
|
||||||
* the new terms are clearly indicated on the first page of each file where
|
* the new terms are clearly indicated on the first page of each file where
|
||||||
* they apply.
|
* they apply.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
extern void __libc_init_array(void);
|
extern void __libc_init_array(void);
|
||||||
|
|
||||||
extern int main(int, char**, char**);
|
extern int main(int, char**, char**);
|
||||||
|
|
||||||
extern void exit(int) __attribute__((noreturn, weak));
|
extern void exit(int) __attribute__((noreturn, weak));
|
||||||
|
|
||||||
/* The linker must ensure that these are at least 4-byte aligned. */
|
/* The linker must ensure that these are at least 4-byte aligned. */
|
||||||
extern char __data_start__, __data_end__;
|
extern char __data_start__, __data_end__;
|
||||||
extern char __bss_start__, __bss_end__;
|
extern char __bss_start__, __bss_end__;
|
||||||
|
|
||||||
struct rom_img_cfg {
|
struct rom_img_cfg {
|
||||||
int *img_start;
|
int *img_start;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern char _lm_rom_img_cfgp;
|
extern char _lm_rom_img_cfgp;
|
||||||
|
|
||||||
void __attribute__((noreturn)) start_c(void) {
|
void __attribute__((noreturn)) start_c(void) {
|
||||||
struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp;
|
struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp;
|
||||||
int *src = img_cfg->img_start;
|
int *src = img_cfg->img_start;
|
||||||
int *dst = (int*)&__data_start__;
|
int *dst = (int*)&__data_start__;
|
||||||
int exit_code;
|
int exit_code;
|
||||||
|
|
||||||
/* Initialize .data, if necessary. */
|
/* Initialize .data, if necessary. */
|
||||||
if (src != dst) {
|
if (src != dst) {
|
||||||
int *end = (int*)&__data_end__;
|
int *end = (int*)&__data_end__;
|
||||||
while (dst < end) {
|
while (dst < end) {
|
||||||
*dst++ = *src++;
|
*dst++ = *src++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Zero .bss. */
|
/* Zero .bss. */
|
||||||
dst = (int*)&__bss_start__;
|
dst = (int*)&__bss_start__;
|
||||||
while (dst < (int*)&__bss_end__) {
|
while (dst < (int*)&__bss_end__) {
|
||||||
*dst++ = 0;
|
*dst++ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Run initializers. */
|
/* Run initializers. */
|
||||||
__libc_init_array();
|
__libc_init_array();
|
||||||
|
|
||||||
/* Jump to main. */
|
/* Jump to main. */
|
||||||
exit_code = main(0, 0, 0);
|
exit_code = main(0, 0, 0);
|
||||||
if (exit) {
|
if (exit) {
|
||||||
exit(exit_code);
|
exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If exit is NULL, make sure we don't return. */
|
/* If exit is NULL, make sure we don't return. */
|
||||||
for (;;)
|
for (;;)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
|
@ -1,176 +1,176 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* The MIT License
|
* The MIT License
|
||||||
*
|
*
|
||||||
* Copyright (c) 2010 Perry Hung.
|
* Copyright (c) 2010 Perry Hung.
|
||||||
* Copyright (c) 2011, 2012 LeafLabs, LLC.
|
* Copyright (c) 2011, 2012 LeafLabs, LLC.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person
|
* Permission is hereby granted, free of charge, to any person
|
||||||
* obtaining a copy of this software and associated documentation
|
* obtaining a copy of this software and associated documentation
|
||||||
* files (the "Software"), to deal in the Software without
|
* files (the "Software"), to deal in the Software without
|
||||||
* restriction, including without limitation the rights to use, copy,
|
* restriction, including without limitation the rights to use, copy,
|
||||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
* of the Software, and to permit persons to whom the Software is
|
* of the Software, and to permit persons to whom the Software is
|
||||||
* furnished to do so, subject to the following conditions:
|
* furnished to do so, subject to the following conditions:
|
||||||
*
|
*
|
||||||
* The above copyright notice and this permission notice shall be
|
* The above copyright notice and this permission notice shall be
|
||||||
* included in all copies or substantial portions of the Software.
|
* included in all copies or substantial portions of the Software.
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file wirish/syscalls.c
|
* @file wirish/syscalls.c
|
||||||
* @brief newlib stubs
|
* @brief newlib stubs
|
||||||
*
|
*
|
||||||
* Low level system routines used by newlib for basic I/O and memory
|
* Low level system routines used by newlib for basic I/O and memory
|
||||||
* allocation. You can override most of these.
|
* allocation. You can override most of these.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libmaple/libmaple.h>
|
#include <libmaple/libmaple.h>
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
/* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then
|
/* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then
|
||||||
* assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by
|
* assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by
|
||||||
* the linker */
|
* the linker */
|
||||||
#ifndef CONFIG_HEAP_START
|
#ifndef CONFIG_HEAP_START
|
||||||
extern char _lm_heap_start;
|
extern char _lm_heap_start;
|
||||||
#define CONFIG_HEAP_START ((void *)&_lm_heap_start)
|
#define CONFIG_HEAP_START ((void *)&_lm_heap_start)
|
||||||
#endif
|
#endif
|
||||||
#ifndef CONFIG_HEAP_END
|
#ifndef CONFIG_HEAP_END
|
||||||
extern char _lm_heap_end;
|
extern char _lm_heap_end;
|
||||||
#define CONFIG_HEAP_END ((void *)&_lm_heap_end)
|
#define CONFIG_HEAP_END ((void *)&_lm_heap_end)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* _sbrk -- Increment the program break.
|
* _sbrk -- Increment the program break.
|
||||||
*
|
*
|
||||||
* Get incr bytes more RAM (for use by the heap). malloc() and
|
* Get incr bytes more RAM (for use by the heap). malloc() and
|
||||||
* friends call this function behind the scenes.
|
* friends call this function behind the scenes.
|
||||||
*/
|
*/
|
||||||
void *_sbrk(int incr) {
|
void *_sbrk(int incr) {
|
||||||
static void * pbreak = NULL; /* current program break */
|
static void * pbreak = NULL; /* current program break */
|
||||||
void * ret;
|
void * ret;
|
||||||
|
|
||||||
if (pbreak == NULL) {
|
if (pbreak == NULL) {
|
||||||
pbreak = CONFIG_HEAP_START;
|
pbreak = CONFIG_HEAP_START;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((CONFIG_HEAP_END - pbreak < incr) ||
|
if ((CONFIG_HEAP_END - pbreak < incr) ||
|
||||||
(pbreak - CONFIG_HEAP_START < -incr)) {
|
(pbreak - CONFIG_HEAP_START < -incr)) {
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return (void *)-1;
|
return (void *)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = pbreak;
|
ret = pbreak;
|
||||||
pbreak += incr;
|
pbreak += incr;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int _open(const char *path, int flags, ...) {
|
__weak int _open(const char *path, int flags, ...) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int _close(int fd) {
|
__weak int _close(int fd) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int _fstat(int fd, struct stat *st) {
|
__weak int _fstat(int fd, struct stat *st) {
|
||||||
st->st_mode = S_IFCHR;
|
st->st_mode = S_IFCHR;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int _isatty(int fd) {
|
__weak int _isatty(int fd) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int isatty(int fd) {
|
__weak int isatty(int fd) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int _lseek(int fd, off_t pos, int whence) {
|
__weak int _lseek(int fd, off_t pos, int whence) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak unsigned char getch(void) {
|
__weak unsigned char getch(void) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
__weak int _read(int fd, char *buf, size_t cnt) {
|
__weak int _read(int fd, char *buf, size_t cnt) {
|
||||||
*buf = getch();
|
*buf = getch();
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak void putch(unsigned char c) {
|
__weak void putch(unsigned char c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak void cgets(char *s, int bufsize) {
|
__weak void cgets(char *s, int bufsize) {
|
||||||
char *p;
|
char *p;
|
||||||
int c;
|
int c;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < bufsize; i++) {
|
for (i = 0; i < bufsize; i++) {
|
||||||
*(s+i) = 0;
|
*(s+i) = 0;
|
||||||
}
|
}
|
||||||
// memset(s, 0, bufsize);
|
// memset(s, 0, bufsize);
|
||||||
|
|
||||||
p = s;
|
p = s;
|
||||||
|
|
||||||
for (p = s; p < s + bufsize-1;) {
|
for (p = s; p < s + bufsize-1;) {
|
||||||
c = getch();
|
c = getch();
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '\r' :
|
case '\r' :
|
||||||
case '\n' :
|
case '\n' :
|
||||||
putch('\r');
|
putch('\r');
|
||||||
putch('\n');
|
putch('\n');
|
||||||
*p = '\n';
|
*p = '\n';
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case '\b' :
|
case '\b' :
|
||||||
if (p > s) {
|
if (p > s) {
|
||||||
*p-- = 0;
|
*p-- = 0;
|
||||||
putch('\b');
|
putch('\b');
|
||||||
putch(' ');
|
putch(' ');
|
||||||
putch('\b');
|
putch('\b');
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default :
|
default :
|
||||||
putch(c);
|
putch(c);
|
||||||
*p++ = c;
|
*p++ = c;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak int _write(int fd, const char *buf, size_t cnt) {
|
__weak int _write(int fd, const char *buf, size_t cnt) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < cnt; i++)
|
for (i = 0; i < cnt; i++)
|
||||||
putch(buf[i]);
|
putch(buf[i]);
|
||||||
|
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Override fgets() in newlib with a version that does line editing */
|
/* Override fgets() in newlib with a version that does line editing */
|
||||||
__weak char *fgets(char *s, int bufsize, void *f) {
|
__weak char *fgets(char *s, int bufsize, void *f) {
|
||||||
cgets(s, bufsize);
|
cgets(s, bufsize);
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
__weak void _exit(int exitcode) {
|
__weak void _exit(int exitcode) {
|
||||||
while (1)
|
while (1)
|
||||||
;
|
;
|
||||||
}
|
}
|
Loading…
Reference in New Issue