|
|
|
@@ -1 +1,199 @@
|
|
|
|
|
ENTRY( _start )␍␍__stack_size = 2048;␍␍PROVIDE( _stack_size = __stack_size );␍␍␍MEMORY␍{ ␍/* CH32V20x_D6 - CH32V203F6-CH32V203G6-CH32V203K6-CH32V203C6 */␍/*␍ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 32K␍ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 10K␍*/ ␍␍/* CH32V20x_D6 - CH32V203K8-CH32V203C8-CH32V203G8-CH32V203F8 */␍/*␍ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K␍ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K␍*/ ␍ ␍/* CH32V20x_D8 - CH32V203RB␍ CH32V20x_D8W - CH32V208x␍ FLASH + RAM supports the following configuration␍ FLASH-128K + RAM-64K␍ FLASH-144K + RAM-48K␍ FLASH-160K + RAM-32K␍*/␍ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 16K␍ RAM (xrw) : ORIGIN = 0x20004000, LENGTH = 48K␍}␍␍ PROVIDE( __global_pointer$ = 0x20004000 );␍␍SECTIONS␍{␍␍ .init :␍ {␍ _sinit = .;␍ . = ALIGN(4);␍ KEEP(*(SORT_NONE(.init)))␍ . = ALIGN(4);␍ _einit = .;␍ } >FLASH AT>FLASH␍␍ .vector :␍ {␍ *(.vector);␍ . = ALIGN(64);␍ KEEP(*(SORT_NONE(.handle_reset)))␍ } >FLASH AT>FLASH␍ ␍ .highcode : ␍ {␍ . = ALIGN(4);␍ *(.highcode);␍ *(.highcode.*);␍ . = ALIGN(4); ␍ } >FLASH AT>FLASH␍ ␍ .text :␍ {␍ . = ALIGN(4);␍ *(.text)␍ *(.text.*)␍ *(.rodata)␍ *(.rodata*)␍ *(.sdata2.*)␍ *(.gnu.linkonce.t.*)␍ . = ALIGN(4);␍ } >FLASH AT>FLASH ␍␍ .fini :␍ {␍ KEEP(*(SORT_NONE(.fini)))␍ . = ALIGN(4);␍ } >FLASH AT>FLASH␍␍ PROVIDE( _etext = . );␍ PROVIDE( _eitcm = . ); ␍␍ .preinit_array :␍ {␍ PROVIDE_HIDDEN (__preinit_array_start = .);␍ KEEP (*(.preinit_array))␍ PROVIDE_HIDDEN (__preinit_array_end = .);␍ } >FLASH AT>FLASH ␍ ␍ .init_array :␍ {␍ PROVIDE_HIDDEN (__init_array_start = .);␍ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))␍ KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))␍ PROVIDE_HIDDEN (__init_array_end = .);␍ } >FLASH AT>FLASH ␍ ␍ .fini_array :␍ {␍ PROVIDE_HIDDEN (__fini_array_start = .);␍ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))␍ KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))␍ PROVIDE_HIDDEN (__fini_array_end = .);␍ } >FLASH AT>FLASH ␍ ␍ .ctors :␍ {␍ /* gcc uses crtbegin.o to find the start of␍ the constructors, so we make sure it is␍ first. Because this is a wildcard, it␍ doesn't matter if the user does not␍ actually link against crtbegin.o; the␍ linker won't look for a file to match a␍ wildcard. The wildcard also means that it␍ doesn't matter which directory crtbegin.o␍ is in. */␍ KEEP (*crtbegin.o(.ctors))␍ KEEP (*crtbegin?.o(.ctors))␍ /* We don't want to include the .ctor section from␍ the crtend.o file until after the sorted ctors.␍ The .ctor section from the crtend file contains the␍ end of ctors marker and it must be last */␍ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))␍ KEEP (*(SORT(.ctors.*)))␍ KEEP (*(.ctors))␍ } >FLASH AT>FLASH ␍ ␍ .dtors :␍ {␍ KEEP (*crtbegin.o(.dtors))␍ KEEP (*crtbegin?.o(.dtors))␍ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))␍ KEEP (*(SORT(.dtors.*)))␍ KEEP (*(.dtors))␍ } >FLASH AT>FLASH ␍␍ .dalign :␍ {␍ . = ALIGN(4);␍ PROVIDE(_data_vma = .);␍ } >RAM AT>FLASH ␍␍ .dlalign :␍ {␍ . = ALIGN(4); ␍ PROVIDE(_data_lma = .);␍ } >FLASH AT>FLASH␍␍ .data :␍ {␍ *(.gnu.linkonce.r.*)␍ *(.data .data.*)␍ *(.gnu.linkonce.d.*)␍ . = ALIGN(8);␍ PROVIDE( __global_pointer$ = . + 0x800 );␍ *(.sdata .sdata.*)␍ *(.gnu.linkonce.s.*)␍ . = ALIGN(8);␍ *(.srodata.cst16)␍ *(.srodata.cst8)␍ *(.srodata.cst4)␍ *(.srodata.cst2)␍ *(.srodata .srodata.*)␍ . = ALIGN(4);␍ PROVIDE( _edata = .);␍ } >RAM AT>FLASH␍␍ .bss :␍ {␍ . = ALIGN(4);␍ PROVIDE( _sbss = .);␍ *(.sbss*)␍ *(.gnu.linkonce.sb.*)␍ *(.bss*)␍ *(.gnu.linkonce.b.*) ␍ *(COMMON*)␍ . = ALIGN(4);␍ PROVIDE( _ebss = .);␍ } >RAM AT>FLASH␍␍ PROVIDE( _end = _ebss);␍ PROVIDE( end = . );␍␍ /*.stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size :␍ {␍ PROVIDE( _heap_end = . ); ␍ . = ALIGN(4);␍ PROVIDE(_susrstack = . );␍ . = . + __stack_size;␍ PROVIDE( _eusrstack = .);␍ } >RAM */␍␍ .stack ORIGIN(RAM)+LENGTH(RAM) :␍ {␍ PROVIDE( _heap_end = . ); ␍ . = ALIGN(4);␍ PROVIDE(_eusrstack = . );␍ } >RAM ␍}␍
|
|
|
|
|
ENTRY( _start )
|
|
|
|
|
|
|
|
|
|
__stack_size = 2048;
|
|
|
|
|
|
|
|
|
|
PROVIDE( _stack_size = __stack_size );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MEMORY
|
|
|
|
|
{
|
|
|
|
|
/* CH32V20x_D6 - CH32V203F6-CH32V203G6-CH32V203C6 */
|
|
|
|
|
/*
|
|
|
|
|
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 32K
|
|
|
|
|
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 10K
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/* CH32V20x_D6 - CH32V203K8-CH32V203C8-CH32V203G8-CH32V203F8 */
|
|
|
|
|
/*
|
|
|
|
|
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K
|
|
|
|
|
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/* CH32V20x_D8 - CH32V203RB
|
|
|
|
|
CH32V20x_D8W - CH32V208x
|
|
|
|
|
FLASH + RAM supports the following configuration
|
|
|
|
|
FLASH-128K + RAM-64K
|
|
|
|
|
FLASH-144K + RAM-48K
|
|
|
|
|
FLASH-160K + RAM-32K
|
|
|
|
|
*/
|
|
|
|
|
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 16K
|
|
|
|
|
RAM (xrw) : ORIGIN = 0x20004000, LENGTH = 48K
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PROVIDE( __global_pointer$ = 0x20004000 );
|
|
|
|
|
|
|
|
|
|
SECTIONS
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
.init :
|
|
|
|
|
{
|
|
|
|
|
_sinit = .;
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
KEEP(*(SORT_NONE(.init)))
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
_einit = .;
|
|
|
|
|
} >FLASH AT>FLASH
|
|
|
|
|
|
|
|
|
|
.vector :
|
|
|
|
|
{
|
|
|
|
|
*(.vector);
|
|
|
|
|
. = ALIGN(64);
|
|
|
|
|
KEEP(*(SORT_NONE(.handle_reset)))
|
|
|
|
|
} >FLASH AT>FLASH
|
|
|
|
|
|
|
|
|
|
.highcode :
|
|
|
|
|
{
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
*(.highcode);
|
|
|
|
|
*(.highcode.*);
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
} >FLASH AT>FLASH
|
|
|
|
|
|
|
|
|
|
.text :
|
|
|
|
|
{
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
*(.text)
|
|
|
|
|
*(.text.*)
|
|
|
|
|
*(.rodata)
|
|
|
|
|
*(.rodata*)
|
|
|
|
|
*(.sdata2.*)
|
|
|
|
|
*(.gnu.linkonce.t.*)
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
} >FLASH AT>FLASH
|
|
|
|
|
|
|
|
|
|
.fini :
|
|
|
|
|
{
|
|
|
|
|
KEEP(*(SORT_NONE(.fini)))
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
} >FLASH AT>FLASH
|
|
|
|
|
|
|
|
|
|
PROVIDE( _etext = . );
|
|
|
|
|
PROVIDE( _eitcm = . );
|
|
|
|
|
|
|
|
|
|
.preinit_array :
|
|
|
|
|
{
|
|
|
|
|
PROVIDE_HIDDEN (__preinit_array_start = .);
|
|
|
|
|
KEEP (*(.preinit_array))
|
|
|
|
|
PROVIDE_HIDDEN (__preinit_array_end = .);
|
|
|
|
|
} >FLASH AT>FLASH
|
|
|
|
|
|
|
|
|
|
.init_array :
|
|
|
|
|
{
|
|
|
|
|
PROVIDE_HIDDEN (__init_array_start = .);
|
|
|
|
|
KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
|
|
|
|
|
KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
|
|
|
|
|
PROVIDE_HIDDEN (__init_array_end = .);
|
|
|
|
|
} >FLASH AT>FLASH
|
|
|
|
|
|
|
|
|
|
.fini_array :
|
|
|
|
|
{
|
|
|
|
|
PROVIDE_HIDDEN (__fini_array_start = .);
|
|
|
|
|
KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
|
|
|
|
|
KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
|
|
|
|
|
PROVIDE_HIDDEN (__fini_array_end = .);
|
|
|
|
|
} >FLASH AT>FLASH
|
|
|
|
|
|
|
|
|
|
.ctors :
|
|
|
|
|
{
|
|
|
|
|
/* gcc uses crtbegin.o to find the start of
|
|
|
|
|
the constructors, so we make sure it is
|
|
|
|
|
first. Because this is a wildcard, it
|
|
|
|
|
doesn't matter if the user does not
|
|
|
|
|
actually link against crtbegin.o; the
|
|
|
|
|
linker won't look for a file to match a
|
|
|
|
|
wildcard. The wildcard also means that it
|
|
|
|
|
doesn't matter which directory crtbegin.o
|
|
|
|
|
is in. */
|
|
|
|
|
KEEP (*crtbegin.o(.ctors))
|
|
|
|
|
KEEP (*crtbegin?.o(.ctors))
|
|
|
|
|
/* We don't want to include the .ctor section from
|
|
|
|
|
the crtend.o file until after the sorted ctors.
|
|
|
|
|
The .ctor section from the crtend file contains the
|
|
|
|
|
end of ctors marker and it must be last */
|
|
|
|
|
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
|
|
|
|
|
KEEP (*(SORT(.ctors.*)))
|
|
|
|
|
KEEP (*(.ctors))
|
|
|
|
|
} >FLASH AT>FLASH
|
|
|
|
|
|
|
|
|
|
.dtors :
|
|
|
|
|
{
|
|
|
|
|
KEEP (*crtbegin.o(.dtors))
|
|
|
|
|
KEEP (*crtbegin?.o(.dtors))
|
|
|
|
|
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
|
|
|
|
|
KEEP (*(SORT(.dtors.*)))
|
|
|
|
|
KEEP (*(.dtors))
|
|
|
|
|
} >FLASH AT>FLASH
|
|
|
|
|
|
|
|
|
|
.dalign :
|
|
|
|
|
{
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
PROVIDE(_data_vma = .);
|
|
|
|
|
} >RAM AT>FLASH
|
|
|
|
|
|
|
|
|
|
.dlalign :
|
|
|
|
|
{
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
PROVIDE(_data_lma = .);
|
|
|
|
|
} >FLASH AT>FLASH
|
|
|
|
|
|
|
|
|
|
.data :
|
|
|
|
|
{
|
|
|
|
|
*(.gnu.linkonce.r.*)
|
|
|
|
|
*(.data .data.*)
|
|
|
|
|
*(.gnu.linkonce.d.*)
|
|
|
|
|
. = ALIGN(8);
|
|
|
|
|
PROVIDE( __global_pointer$ = . + 0x800 );
|
|
|
|
|
*(.sdata .sdata.*)
|
|
|
|
|
*(.gnu.linkonce.s.*)
|
|
|
|
|
. = ALIGN(8);
|
|
|
|
|
*(.srodata.cst16)
|
|
|
|
|
*(.srodata.cst8)
|
|
|
|
|
*(.srodata.cst4)
|
|
|
|
|
*(.srodata.cst2)
|
|
|
|
|
*(.srodata .srodata.*)
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
PROVIDE( _edata = .);
|
|
|
|
|
} >RAM AT>FLASH
|
|
|
|
|
|
|
|
|
|
.bss :
|
|
|
|
|
{
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
PROVIDE( _sbss = .);
|
|
|
|
|
*(.sbss*)
|
|
|
|
|
*(.gnu.linkonce.sb.*)
|
|
|
|
|
*(.bss*)
|
|
|
|
|
*(.gnu.linkonce.b.*)
|
|
|
|
|
*(COMMON*)
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
PROVIDE( _ebss = .);
|
|
|
|
|
} >RAM AT>FLASH
|
|
|
|
|
|
|
|
|
|
PROVIDE( _end = _ebss);
|
|
|
|
|
PROVIDE( end = . );
|
|
|
|
|
|
|
|
|
|
/*.stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size :
|
|
|
|
|
{
|
|
|
|
|
PROVIDE( _heap_end = . );
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
PROVIDE(_susrstack = . );
|
|
|
|
|
. = . + __stack_size;
|
|
|
|
|
PROVIDE( _eusrstack = .);
|
|
|
|
|
} >RAM */
|
|
|
|
|
|
|
|
|
|
.stack ORIGIN(RAM)+LENGTH(RAM) :
|
|
|
|
|
{
|
|
|
|
|
PROVIDE( _heap_end = . );
|
|
|
|
|
. = ALIGN(4);
|
|
|
|
|
PROVIDE(_eusrstack = . );
|
|
|
|
|
} >RAM
|
|
|
|
|
}
|
|
|
|
|