/*
|
** Default LDF for C applications targeting ADSP-21489.
|
**
|
** There are a number of configuration macros that may be specified as a
|
** result of use of certain compiler switches or by linker flags directly.
|
** The options are:
|
** __ADI_LIBEH__
|
** Link against C++ libraries with exception handling enabled.
|
** _ADI_THREADS
|
** Link against thread-safe variants of the run-time libraries.
|
** __NORMAL_WORD_CODE__
|
** Indicates that the application should link against runtime libraries
|
** build with normal word encoding (-nwc).
|
** __SHORT_WORD_CODE__
|
** Indicates that the application should link against runtime libraries
|
** build with short word encoding (-swc).
|
** __LIBIO_LITE
|
** The I/O library provides support for printing hexadecimal constants
|
** using the "%a" conversion specifier, and for registering alternatives to
|
** the default device driver that is supported by the VisualDSP++ simulator
|
** and EZ-KIT Lite systems. Those applications that do not require this
|
** functionality may define the macro __LIBIO_LITE which will select an
|
** alternative I/O library and lead to reduced code occupancy.
|
** __LIBIO_FX
|
** Defining this macro causes use of a variant of the I/O library which
|
** contains full support for the fixed-point format specifiers, %r and %R.
|
** In contrast, the standard I/O library will print fixed-point constants
|
** with these specifiers as hexadecimal, in order to provide reduced code
|
** occupancy.
|
** __NO_STD_LIB
|
** Defined by the compiler when switch -no-std-lib is used and causes
|
** the LDF to avoid using the standard VisualDSP++ library search path.
|
** __MEMINIT__
|
** Macro defined by the linker when -meminit is used to enable runtime
|
** initialization.
|
** USE_SDRAM
|
** Makes SDRAM available as standard program and data memory.
|
** USE_SDRAM_HEAP
|
** Use SDRAM for dynamic heap allocation rather than L1 default. Should
|
** result in a much larger heap being available but can have a significant
|
** performance impact.
|
** USE_SDRAM_STACK
|
** Use SDRAM for system stack rather than L1 default. Should allow for
|
** much larger stack but likely to have a significant performance impact.
|
*/
|
|
ARCHITECTURE(ADSP-21489)
|
|
#if defined(__NORMAL_WORD_CODE__) && defined(__SHORT_WORD_CODE__)
|
# error Both "__NORMAL_WORD_CODE__" and "__SHORT_WORD_CODE__" have been defined. These macros are mutually exclusive.
|
#endif
|
|
|
#ifndef __NO_STD_LIB
|
SEARCH_DIR( $ADI_DSP/214xx/lib )
|
#endif
|
|
#ifdef __NORMAL_WORD_CODE__
|
# define RT_LIB_NAME(n) lib ## n ## _nwc.dlb
|
#else
|
# define RT_LIB_NAME(n) lib ## n ## .dlb
|
#endif
|
|
#ifdef _ADI_THREADS
|
# define RT_LIB_NAME_MT(n) RT_LIB_NAME(n ## mt)
|
#else
|
# define RT_LIB_NAME_MT(n) RT_LIB_NAME(n)
|
#endif
|
|
#ifdef __ADI_LIBEH__
|
# define RT_LIB_NAME_EH(n) RT_LIB_NAME_MT(n ## eh)
|
#else
|
# define RT_LIB_NAME_EH(n) RT_LIB_NAME_MT(n)
|
#endif
|
|
#define USE_SDRAM
|
// Libraries from the command line are included in COMMAND_LINE_OBJECTS.
|
$LIBRARIES =
|
RT_LIB_NAME_MT(c),
|
#ifdef __LIBIO_LITE
|
RT_LIB_NAME_MT(io_lite),
|
#elif defined(__LIBIO_FX)
|
RT_LIB_NAME_MT(io_fx),
|
#else
|
RT_LIB_NAME_MT(io),
|
#endif
|
RT_LIB_NAME_EH(cpp),
|
RT_LIB_NAME(dsp);
|
|
$OBJECTS =
|
21489_hdr.doj,
|
$COMMAND_LINE_OBJECTS;
|
|
/*
|
** List of objects which prefer internal memory placement
|
*/
|
$OBJS_LIBS_INTERNAL =
|
$OBJECTS{prefersMem("internal")},
|
$LIBRARIES{prefersMem("internal")};
|
|
/*
|
** List of objects which don't prefer external memory placement
|
*/
|
$OBJS_LIBS_NOT_EXTERNAL =
|
$OBJECTS{!prefersMem("external")},
|
$LIBRARIES{!prefersMem("external")};
|
|
#if defined(USE_SDRAM_STACK) || defined(USE_SDRAM_HEAP)
|
#warning Putting stack/heap into external sdram can have a serious performance impact
|
#if !defined(USE_SDRAM)
|
#define USE_SDRAM
|
#endif
|
#endif
|
|
/*
|
** minimum sizes of the stack and heap allocated
|
*/
|
#define STACK_SIZE 8K
|
#define HEAP_SIZE 16
|
#define STACKHEAP_SIZE 24
|
|
MEMORY
|
{
|
// The SHARC 21489 has 5Mbit RAM and 4Mbit ROM in total.
|
// -------------------------- BLOCK 0 ----------------------------------------
|
// 0x0008 C000 to 0x0009 3FFF Normal word (48) Space (1.5 Mbit RAM)
|
// 0x0009 2000 to 0x0009 DFFF Normal word (32) Space (1.5 Mbit RAM)
|
// 0x0012 4000 to 0x0013 BFFF Short word (16) Space (1.5 Mbit RAM)
|
seg_rth { TYPE(PM RAM) START(0x0008c000) END(0x0008c0ff) WIDTH(48) }
|
#ifdef __MEMINIT__
|
seg_init { TYPE(PM RAM) START(0x0008c100) END(0x0008c2ff) WIDTH(48) }
|
seg_int_code { TYPE(SW RAM) START(0x00124900) END(0x0013Bfff) WIDTH(16) }
|
#else
|
//seg_int_code { TYPE(SW RAM) START(0x00124300) END(0x00133FFF) WIDTH(16) }
|
seg_int_code { TYPE(SW RAM) START(0x00124300) END(0x0013BFFF) WIDTH(16) }
|
|
//seg_mem1 { TYPE(DM RAM) START(0x0009a000) END(0x0009dfff) WIDTH(32) }
|
#endif // __MEMINIT__
|
|
// -------------------------- BLOCK 1 ----------------------------------------
|
// 0x000A C000 to 0x000B 3FFF Normal word (48) Space (1.5 Mbit RAM)
|
// 0x000B 2000 to 0x000B DFFF Normal word (32) Space (1.5 Mbit RAM)
|
// 0x0016 4000 to 0x0017 BFFF Short word (16) Space (1.5 Mbit RAM)
|
#ifdef IDDE_ARGS
|
#define ARGV_START 0xb2000
|
mem_argv { TYPE(DM RAM) START(0x000b2000) END(0x000b20ff) WIDTH(32) }
|
seg_dmda { TYPE(DM RAM) START(0x000b2100) END(0x000bbfff) WIDTH(32) }
|
#else
|
seg_dmda { TYPE(DM RAM) START(0x000b2000) END(0x000b9fff) WIDTH(32) }
|
seg_mem1 { TYPE(DM RAM) START(0x000ba000) END(0x000bdfff) WIDTH(32) }
|
#endif
|
|
// -------------------------- BLOCK 2 ----------------------------------------
|
// 0x000C 0000 to 0x000C 5554 Normal word (48) Space (1 Mbit RAM)
|
// 0x000C 0000 to 0x000C 7FFF Normal word (32) Space (1 Mbit RAM)
|
// 0x0018 0000 to 0x0018 FFFF Short word (16) Space (1 Mbit RAM)
|
seg_stak { TYPE(DM RAM) START(0x000C0000) END(0x000C2fff) WIDTH(32) }
|
aec_mem { TYPE(DM RAM) START(0x000C3000) END(0x000C6FFF) WIDTH(32) }
|
seg_pmda { TYPE(PM RAM) START(0x000C7000) END(0x000C7FFF) WIDTH(32) }
|
|
// ------------------------- BLOCK 3 -----------------------------------------
|
// 0x000E 0000 to 0x000E 5554 Normal word (48) Space (1 Mbit RAM)
|
// 0x000E 0000 to 0x000E 7FFF Normal word (32) Space (1 Mbit RAM)
|
// 0x001C 0000 to 0x001C FFFF Short word (16) Space (1 Mbit RAM)
|
seg_mem2{ TYPE(DM RAM) START(0x000e0000) END(0x000e7fff) WIDTH(32) }
|
// ------------------------- SDRAM -------------------------------------------
|
// 0x00200000 to 0x009FFFFF Normal word (32) Space (32MB RAM) as found on the
|
// ADSP-21489 Ez-Board.
|
//
|
// Notes:
|
// 1) For Code accesses, which are only supported in Bank 0 of External
|
// port, address range is:
|
// - For VISA code (i.e 16bit accesses) : 0x600000 - 0xFFFFFF
|
// - For NonVISA code (i.e 48 bit accesses) : 0x200000 - 0x5FFFFF
|
//
|
// 2) The linker does not understand address translation so does not detect
|
// overlaps correctly which means that errors can be issued for non-
|
// overlapping sections and also that no errors are issued for overlapping
|
// sections. (TAR-43296)
|
|
seg_ext_swco { TYPE(SW RAM) START(0x00600000) END(0x0060FFFF) WIDTH(16) }
|
seg_ext_nwco { TYPE(PM RAM) START(0x00220000) END(0x0043FFFF) WIDTH(16) }
|
seg_ext_pmda { TYPE(DM RAM) START(0x00610000) END(0x0061FFFF) WIDTH(16) }
|
seg_ext_dmda { TYPE(DM RAM) START(0x00620000) END(0x0064FFFF) WIDTH(16) }
|
|
seg_heap { TYPE(DM RAM) START(0x00650000) END(0x0065FFFF) WIDTH(16) }
|
seg_mem4 { TYPE(DM RAM) START(0x00660000) END(0x00e5FFFF) WIDTH(16) }
|
|
|
seg_flash { TYPE(DM RAM) START(0x04000000) END(0x043FFFFF) WIDTH(8) }
|
seg_sram { TYPE(DM RAM) START(0x0C000000) END(0x0C07FFFF) WIDTH(16) }
|
} /* MEMORY */
|
|
|
PROCESSOR p0
|
{
|
#ifdef IDDE_ARGS
|
RESOLVE(___argv_string, ARGV_START)
|
#endif
|
KEEP( _main,___lib_end_of_heap_descriptions )
|
LINK_AGAINST( $COMMAND_LINE_LINK_AGAINST )
|
OUTPUT( $COMMAND_LINE_OUTPUT_FILE )
|
|
SECTIONS
|
{
|
seg_rth PM
|
{
|
NO_FORCE_CONTIGUITY
|
INPUT_SECTIONS( $OBJECTS(seg_rth) $LIBRARIES(seg_rth))
|
} > seg_rth
|
|
seg_init PM
|
{
|
ldf_seginit_space = . ;
|
INPUT_SECTIONS( $OBJECTS(seg_init) $LIBRARIES(seg_init))
|
}
|
#if defined(__MEMINIT__)
|
> seg_init
|
#else
|
> seg_int_code
|
#endif
|
|
seg_int_code_sw SW
|
{
|
FILL(0x1)
|
NO_FORCE_CONTIGUITY
|
// map code required to be in internal memory first
|
INPUT_SECTIONS( $OBJECTS(seg_int_code_sw) $LIBRARIES(seg_int_code_sw))
|
INPUT_SECTIONS( $OBJECTS(seg_int_code) $LIBRARIES(seg_int_code))
|
} > seg_int_code
|
|
seg_int_code PM
|
{
|
NO_FORCE_CONTIGUITY
|
// map code required to be in internal memory first
|
INPUT_SECTIONS( $OBJECTS(seg_int_code) $LIBRARIES(seg_int_code))
|
} > seg_int_code
|
|
seg_swco SW
|
{
|
FILL(0x1)
|
NO_FORCE_CONTIGUITY
|
// now map the default code sections, sw first
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(seg_swco))
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(seg_swco))
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(seg_pmco))
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(seg_pmco))
|
INPUT_SECTIONS( $OBJECTS(seg_swco) $LIBRARIES(seg_swco))
|
INPUT_SECTIONS( $OBJECTS(seg_pmco) $LIBRARIES(seg_pmco))
|
} > seg_int_code
|
|
seg_pmco PM
|
{
|
NO_FORCE_CONTIGUITY
|
// now map the default code sections, pm after sw
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(seg_pmco))
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(seg_pmco))
|
INPUT_SECTIONS( $OBJECTS(seg_pmco) $LIBRARIES(seg_pmco))
|
} > seg_int_code
|
|
seg_pmda
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(seg_pmda))
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(seg_pmda))
|
INPUT_SECTIONS( $OBJECTS(seg_pmda) $LIBRARIES(seg_pmda))
|
} > seg_pmda
|
|
|
.bss ZERO_INIT
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(.bss))
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(.bss))
|
INPUT_SECTIONS( $OBJECTS(.bss) $LIBRARIES(.bss))
|
} > seg_dmda
|
|
#if defined(USE_SDRAM_STACK)
|
.bss_stak ZERO_INIT
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(.bss))
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(.bss))
|
INPUT_SECTIONS( $OBJECTS(.bss) $LIBRARIES(.bss))
|
} > seg_stak
|
#endif
|
|
#if defined(USE_SDRAM_HEAP)
|
.bss_heap ZERO_INIT
|
{
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(.bss))
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(.bss))
|
INPUT_SECTIONS( $OBJECTS(.bss) $LIBRARIES(.bss))
|
} > seg_heap
|
#endif
|
|
seg_dmda
|
{
|
INPUT_SECTIONS( $OBJECTS(seg_int_data) $LIBRARIES(seg_int_data))
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(seg_dmda))
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(seg_dmda))
|
INPUT_SECTIONS( $OBJECTS(seg_dmda) $LIBRARIES(seg_dmda))
|
} > seg_dmda
|
|
seg_dmda2
|
{
|
// use unused space in seg_pmda for dmda
|
INPUT_SECTIONS( $OBJECTS(seg_dmda) $LIBRARIES(seg_dmda))
|
} > seg_pmda
|
|
seg_pmda2
|
{
|
// use unused space in seg_dmda for pmda
|
//INPUT_SECTIONS( $OBJECTS(seg_pmda) $LIBRARIES(seg_pmda))
|
} > seg_dmda
|
|
#if defined(USE_SDRAM_STACK)
|
seg_dmda_stak
|
{
|
INPUT_SECTIONS( $OBJECTS(seg_int_data) $LIBRARIES(seg_int_data))
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(seg_dmda))
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(seg_dmda))
|
INPUT_SECTIONS( $OBJECTS(seg_dmda) $LIBRARIES(seg_dmda))
|
} > seg_stak
|
#endif
|
|
#if defined(USE_SDRAM_HEAP)
|
seg_dmda_heap
|
{
|
INPUT_SECTIONS( $OBJECTS(seg_int_data) $LIBRARIES(seg_int_data))
|
INPUT_SECTIONS( $OBJS_LIBS_INTERNAL(seg_dmda))
|
INPUT_SECTIONS( $OBJS_LIBS_NOT_EXTERNAL(seg_dmda))
|
INPUT_SECTIONS( $OBJECTS(seg_dmda) $LIBRARIES(seg_dmda))
|
} > seg_heap
|
#endif
|
|
#if !defined(USE_SDRAM_STACK)
|
stackseg
|
{
|
// allocate a stack for the application
|
ldf_stack_space = .;
|
ldf_stack_length = MEMORY_SIZEOF(seg_stak);
|
ldf_stack_end = ldf_stack_space + ldf_stack_length;
|
} > seg_stak
|
#endif
|
|
#if !defined(USE_SDRAM_HEAP)
|
heap
|
{
|
// allocate a heap for the application
|
ldf_heap_space = .;
|
ldf_heap_length = MEMORY_SIZEOF(seg_heap);
|
ldf_heap_end = ldf_heap_space + ldf_heap_length - 1;
|
} > seg_heap
|
#endif
|
/*pmhp
|
{
|
ldf_pmhp_space = .;
|
ldf_pmhp_lengh = MEMORY_SIZEOF(seg_pmhp);
|
ldf_pmhp_end = ldf_pmhp_space + ldf_pmhp_lengh - 1;
|
} > seg_pmhp
|
*/
|
|
seg_flash
|
{
|
INPUT_SECTIONS($OBJECTS(seg_flash) $LIBRARIES(seg_flash))
|
} > seg_flash
|
|
#if defined(USE_SDRAM)
|
seg_sdram_code_sw SW
|
{
|
INPUT_SECTIONS( $OBJECTS(seg_ext_code) $LIBRARIES(seg_ext_code))
|
// place code we couldn't link internally into SDRAM
|
INPUT_SECTIONS( $OBJECTS(seg_swco) $LIBRARIES(seg_swco))
|
INPUT_SECTIONS( $OBJECTS(seg_pmco) $LIBRARIES(seg_pmco))
|
} > seg_ext_swco
|
|
seg_sdram_code PM
|
{
|
INPUT_SECTIONS( $OBJECTS(seg_ext_code) $LIBRARIES(seg_ext_code))
|
// place code we couldn't link internally into SDRAM
|
INPUT_SECTIONS( $OBJECTS(seg_pmco) $LIBRARIES(seg_pmco))
|
} > seg_ext_nwco
|
|
reserve_ext_stack_and_heap
|
{
|
//reserve memory for heap/stack if we need it
|
#if defined(USE_SDRAM_STACK) && defined(USE_SDRAM_HEAP)
|
RESERVE(stack_and_heap, stack_and_heap_length = STACKHEAP_SIZE)
|
#elif defined(USE_SDRAM_STACK)
|
RESERVE(stack_and_heap, stack_and_heap_length = STACK_SIZE)
|
#elif defined(USE_SDRAM_HEAP)
|
RESERVE(stack_and_heap, stack_and_heap_length = HEAP_SIZE)
|
#endif // USE_SDRAM_STACK && USE_SDRAM_HEAP
|
} > seg_ext_dmda
|
|
.bss_external ZERO_INIT
|
{
|
INPUT_SECTIONS( $OBJECTS(.bss) $LIBRARIES(.bss))
|
} > seg_ext_dmda
|
|
seg_sdram_data
|
{
|
INPUT_SECTIONS( $OBJECTS(seg_ext_data) $LIBRARIES(seg_ext_data))
|
INPUT_SECTIONS( $OBJECTS(seg_sdram) $LIBRARIES(seg_sdram))
|
INPUT_SECTIONS( $OBJECTS(scene_mem) $LIBRARIES(scene_mem))
|
} > seg_ext_dmda
|
|
#if defined(USE_SDRAM_STACK) || defined(USE_SDRAM_HEAP)
|
expand_ext_stack_and_heap
|
{
|
//expand the stack/heap to use the rest of the SDRAM.
|
RESERVE_EXPAND(stack_and_heap, stack_and_heap_length, 0)
|
#if defined(USE_SDRAM_STACK) && defined(USE_SDRAM_HEAP)
|
ldf_stack_space = stack_and_heap;
|
ldf_stack_end = (ldf_stack_space + ((stack_and_heap_length *
|
STACK_SIZE) / (STACK_SIZE + HEAP_SIZE)));
|
ldf_stack_length = ldf_stack_end - ldf_stack_space - 1;
|
ldf_heap_space = ldf_stack_end;
|
ldf_heap_end = stack_and_heap + stack_and_heap_length;
|
ldf_heap_length = ldf_heap_end - ldf_heap_space;
|
#elif defined(USE_SDRAM_STACK)
|
ldf_stack_space = stack_and_heap;
|
ldf_stack_length = stack_and_heap_length;
|
ldf_stack_end = ldf_stack_space + stack_and_heap_length;
|
#elif defined(USE_SDRAM_HEAP)
|
ldf_heap_space = stack_and_heap;
|
ldf_heap_length = stack_and_heap_length;
|
ldf_heap_end = ldf_heap_space + stack_and_heap_length;
|
#endif // USE_SDRAM_STACK && USE_SDRAM_HEAP
|
} > seg_ext_dmda
|
#endif // USE_SDRAM_STACK || USE_SDRAM_HEAP
|
|
seg_ext_pmda
|
{
|
INPUT_SECTIONS( $OBJECTS(seg_ext_pmda) $LIBRARIES(seg_ext_pmda))
|
} > seg_ext_pmda
|
#else
|
seg_ext_code_sw SW
|
{
|
INPUT_SECTIONS( $OBJECTS(seg_ext_code) $LIBRARIES(seg_ext_code))
|
} > seg_ext_swco
|
|
seg_ext_code PM
|
{
|
INPUT_SECTIONS( $OBJECTS(seg_ext_code) $LIBRARIES(seg_ext_code))
|
} > seg_ext_nwco
|
|
seg_ext_data
|
{
|
INPUT_SECTIONS( $OBJECTS(seg_ext_data) $LIBRARIES(seg_ext_data))
|
INPUT_SECTIONS( $OBJECTS(seg_sdram) $LIBRARIES(seg_sdram))
|
} > seg_ext_dmda
|
|
seg_ext_pmda
|
{
|
INPUT_SECTIONS( $OBJECTS(seg_ext_pmda) $LIBRARIES(seg_ext_pmda))
|
} > seg_ext_pmda
|
#endif // USE_SDRAM
|
|
seg_sram
|
{
|
INPUT_SECTIONS( $OBJECTS(seg_sram) $LIBRARIES(seg_sram))
|
} > seg_sram
|
|
} /* SECTIONS */
|
} /* PROCESSOR p0 */
|