Index: ADC/ADC_gpio_mode/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/ADC/ADC_gpio_mode/prj/GCC/makefile	(revision 725)
+++ /YC3121_demo/ModuleDemo/ADC/ADC_gpio_mode/prj/GCC/makefile	(working copy)
@@ -21,14 +21,18 @@
 CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
              $(LIB_PATH)/core/system \
              $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
-             $(LIB_PATH)/sdk/yc_sysctrl \
-             $(LIB_PATH)/sdk/yc_adc
+             $(LIB_PATH)/sdk/yc_adc \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_sysctrl
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -36,22 +40,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -62,7 +214,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: ADC/ADC_gpio_mode/prj/MDK/YC3121_Keil.uvoptx
===================================================================
--- /YC3121_demo/ModuleDemo/ADC/ADC_gpio_mode/prj/MDK/YC3121_Keil.uvoptx	(revision 725)
+++ /YC3121_demo/ModuleDemo/ADC/ADC_gpio_mode/prj/MDK/YC3121_Keil.uvoptx	(working copy)
@@ -28,7 +28,7 @@
     <TargetOption>
       <CLKADS>12000000</CLKADS>
       <OPTTT>
-        <gFlags>1</gFlags>
+        <gFlags>0</gFlags>
         <BeepAtEnd>1</BeepAtEnd>
         <RunSim>0</RunSim>
         <RunTarget>1</RunTarget>
@@ -77,7 +77,7 @@
         <tvExpOptDlg>0</tvExpOptDlg>
         <IsCurrentTarget>1</IsCurrentTarget>
       </OPTFL>
-      <CpuCode>7</CpuCode>
+      <CpuCode>0</CpuCode>
       <DebugOpt>
         <uSim>0</uSim>
         <uTrg>1</uTrg>
@@ -103,7 +103,7 @@
         <bEvRecOn>1</bEvRecOn>
         <bSchkAxf>0</bSchkAxf>
         <bTchkAxf>0</bTchkAxf>
-        <nTsel>4</nTsel>
+        <nTsel>0</nTsel>
         <sDll></sDll>
         <sDllPa></sDllPa>
         <sDlgDll></sDlgDll>
@@ -113,42 +113,12 @@
         <tDllPa></tDllPa>
         <tDlgDll></tDlgDll>
         <tDlgPa></tDlgPa>
-        <tIfile>..\..\..\..\..\ConfigFiles\MDK\flash.ini</tIfile>
-        <pMon>Segger\JL2CM3.dll</pMon>
+        <tIfile></tIfile>
+        <pMon>BIN\UL2CM3.DLL</pMon>
       </DebugOpt>
       <TargetDriverDllRegistry>
         <SetRegEntry>
           <Number>0</Number>
-          <Key>CMSIS_AGDI</Key>
-          <Name>-X"Fire CMSIS-DAP" -UHS-00001478 -O206 -S0 -C0 -P00 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -TO18 -TC10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN0</Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>PWSTATINFO</Key>
-          <Name>200,50,700</Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>ARMRTXEVENTFLAGS</Key>
-          <Name>-L70 -Z18 -C0 -M0 -T1</Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>DLGTARM</Key>
-          <Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)</Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>ARMDBGFLAGS</Key>
-          <Name></Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
-          <Key>JL2CM3</Key>
-          <Name>-U4294967295 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000 -FCA000 -FN1 -FF0YC3121 -FS01000200 -FL01000000</Name>
-        </SetRegEntry>
-        <SetRegEntry>
-          <Number>0</Number>
           <Key>UL2CM3</Key>
           <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000)</Name>
         </SetRegEntry>
@@ -160,12 +130,12 @@
       <DebugFlag>
         <trace>0</trace>
         <periodic>0</periodic>
-        <aLwin>1</aLwin>
+        <aLwin>0</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
         <aSer2>0</aSer2>
         <aPa>0</aPa>
-        <viewmode>1</viewmode>
+        <viewmode>0</viewmode>
         <vrSel>0</vrSel>
         <aSym>0</aSym>
         <aTbox>0</aTbox>
@@ -201,7 +171,7 @@
 
   <Group>
     <GroupName>core</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -265,7 +235,7 @@
 
   <Group>
     <GroupName>sdk</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -369,7 +339,7 @@
 
   <Group>
     <GroupName>startup</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
Index: ADC/ADC_gpio_mode/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/ADC/ADC_gpio_mode/prj/MDK/YC3121_Keil.uvprojx	(revision 725)
+++ /YC3121_demo/ModuleDemo/ADC/ADC_gpio_mode/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -136,8 +136,8 @@
             <Capability>1</Capability>
             <DriverSelection>4100</DriverSelection>
           </Flash1>
-          <bUseTDR>0</bUseTDR>
-          <Flash2>Segger\JL2CM3.dll</Flash2>
+          <bUseTDR>1</bUseTDR>
+          <Flash2>BIN\UL2CM3.DLL</Flash2>
           <Flash3>"" ()</Flash3>
           <Flash4></Flash4>
           <pFcarmOut></pFcarmOut>
@@ -184,6 +184,7 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
Index: ADC/ADC_gpiodiff_mode/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/ADC/ADC_gpiodiff_mode/prj/GCC/makefile	(revision 725)
+++ /YC3121_demo/ModuleDemo/ADC/ADC_gpiodiff_mode/prj/GCC/makefile	(working copy)
@@ -21,14 +21,18 @@
 CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
              $(LIB_PATH)/core/system \
              $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
-             $(LIB_PATH)/sdk/yc_sysctrl \
-             $(LIB_PATH)/sdk/yc_adc
+             $(LIB_PATH)/sdk/yc_adc \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_sysctrl
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -36,22 +40,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -62,7 +214,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: ADC/ADC_hvin_mode/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/ADC/ADC_hvin_mode/prj/GCC/makefile	(revision 725)
+++ /YC3121_demo/ModuleDemo/ADC/ADC_hvin_mode/prj/GCC/makefile	(working copy)
@@ -21,14 +21,18 @@
 CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
              $(LIB_PATH)/core/system \
              $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
-             $(LIB_PATH)/sdk/yc_sysctrl \
-             $(LIB_PATH)/sdk/yc_adc
+             $(LIB_PATH)/sdk/yc_adc \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_sysctrl
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -36,22 +40,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -62,7 +214,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: BPU/RTC/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/BPU/RTC/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/BPU/RTC/prj/GCC/makefile	(working copy)
@@ -21,18 +21,18 @@
 CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
              $(LIB_PATH)/core/system \
              $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
              $(LIB_PATH)/sdk/yc_rtc \
-             $(LIB_PATH)/sdk/yc_lpm 
-
-
-                          
-
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_sysctrl \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_timer 
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -40,22 +40,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -66,7 +214,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: BPU/RTC_Time/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/BPU/RTC_Time/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/BPU/RTC_Time/prj/GCC/makefile	(working copy)
@@ -21,18 +21,19 @@
 CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
              $(LIB_PATH)/core/system \
              $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
              $(LIB_PATH)/sdk/yc_rtc \
-             $(LIB_PATH)/sdk/yc_lpm 
-
-
-                          
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_sysctrl \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_timer 
 
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -40,22 +41,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
-LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap  $(LIB_PATH)/sdk/libyc_qspi.a -lc -lm -lgcc -lnosys -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -66,7 +215,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: BPU/RTC_Time/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/BPU/RTC_Time/prj/MDK/YC3121_Keil.uvprojx	(revision 732)
+++ /YC3121_demo/ModuleDemo/BPU/RTC_Time/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -184,6 +184,7 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
Index: BPU/RTC_Time/user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/BPU/RTC_Time/user/main.c	(revision 723)
+++ /YC3121_demo/ModuleDemo/BPU/RTC_Time/user/main.c	(working copy)
@@ -30,10 +30,8 @@
 #include "misc.h"
 #include "time.h"
 #include "yc_qspi.h"
-#include "stdio.h"
-#include "math.h"
-#include "stdlib.h"
 #include "board_config.h"
+#include "stdlib.h"
 
 /* Private typedef -----------------------------------------------------------*/
 /* Private define ------------------------------------------------------------*/
@@ -57,12 +55,11 @@
 
 void UART_Cmd_Menu(void)
 {
-    MyPrintf("-------------RTC������ʱ������԰���---------------\n");
-    MyPrintf("-------------��ָ���ַ�'0'����ʱ��-------\n");
-    MyPrintf("-------------��ָ���ַ�'2'��ʼ��RTCģ��-----Ŧ�۵��û�е���оƬ��λ����Ҫ���³�ʼ��RTC-------\n");
-    MyPrintf("-------------��ָ���ַ�'1'��ȡ��ǰʱ��-------\n");
-
-    MyPrintf("�յ���ʾ�󣬰���������ʱ����14���ַ��ĸ�ʽ����ʱ�䣺��2019��8��20��8��6��6��  ��20190820080606");
+	MyPrintf("-------------RTC UART CMD----------------\n");
+	MyPrintf("-------------'0':init RTC----------------\n");
+	MyPrintf("-------------'1':set date and time-------\n");
+	MyPrintf("-------------'2':get date and time-------\n");
+	MyPrintf("example:2019-08-20 08:06:06 is:20190820080606\n");
 }
 
 /**
@@ -77,9 +74,8 @@
     uint8_t uart_command = 0xff;
     MyPrintf("YcChip Yc3121 RTC Demo V1.0.\n");
     UART_Cmd_Menu();
-    g_time_offset =     qspi_flash_read(RTC_OFFSET_ADR, (uint8_t *)(&g_time_offset), 14); //����ʱ��ƫ��ֵ
+    g_time_offset =     qspi_flash_read(RTC_OFFSET_ADR, (uint8_t *)(&g_time_offset), 14);
 
-    //SetDeviceTime();
     while (1)
     {
         if (UART_IsRXFIFONotEmpty(UART0))
@@ -88,7 +84,7 @@
         }
         switch (uart_command)
         {
-        case '0':
+        case '1':
             i = 0;
             MyPrintf("please input time year+mouth+day+hour+second ;format: 20190206125359;\n");
             while (1)
@@ -106,11 +102,11 @@
             uart_command = 0xff;
             break;
 
-        case '1':
+        case '2':
             GetDeviceTime();
             uart_command = 0xff;
             break;
-        case '2':
+        case '0':
             RTC_Configuration();
             MyPrintf("Init RTC\n");
             uart_command = 0xff;
@@ -122,8 +118,8 @@
 
 void RTC_Configuration(void)
 {
-    RTC_Calibration();//RTCУ׼,
-    RTC_SetRefRegister(0);//���¿�ʼ������
+    RTC_Calibration();//RTCУ׼
+    RTC_SetRefRegister(0);
     RTC_Config(ENABLE);
 }
 
@@ -159,6 +155,7 @@
     UART_Init(UART0, &UART_InitStruct);
 }
 
+
 /************************ (C) COPYRIGHT Yichip Microelectronics *****END OF FILE****/
 
 uint8_t SetDeviceTime(void)
@@ -172,7 +169,6 @@
     short hour, min, sec, year, month, day;
     struct tm bTime;
 
-    //ȡ�������ַ�
     memcpy(bufYear, Timebuf, 4);
     memcpy(bufMonth, Timebuf + 4, 2);
     memcpy(bufDay, Timebuf + 6, 2);
@@ -180,7 +176,6 @@
     memcpy(bufMin, Timebuf + 10, 2);
     memcpy(bufSec, Timebuf + 12, 2);
 
-    //�任������
     year = atoi((const char *)bufYear);
     month = atoi((const char *)bufMonth);
     day = atoi((const char *)bufDay);
@@ -188,7 +183,6 @@
     min = atoi((const char *)bufMin);
     sec = atoi((const char *)bufSec);
 
-    //���ݷ���������ؽṹ��
     bTime.tm_year = year - 1900;
     bTime.tm_mon = month - 1;
     bTime.tm_mday = day;
@@ -199,9 +193,8 @@
 
 
     RTC_SetRefRegister(0);
-    g_time_offset = mktime(&bTime) - RTC_GetRefRegister();//��������ȥRTC����ֵ�õ�ƫ����
+    g_time_offset = mktime(&bTime) - RTC_GetRefRegister();
 
-    //����ƫ��ֵ
     qspi_flash_sectorerase(RTC_OFFSET_ADR);
     qspi_flash_write(RTC_OFFSET_ADR, (uint8_t *)(&g_time_offset), 4);
     return 0 ;
@@ -219,29 +212,12 @@
     int now = 0;
     struct tm *pTime;
 
-    now = RTC_GetRefRegister();        //��ȡʵʱ�Ӽ���ֵ
+    now = RTC_GetRefRegister();
 
-    qspi_flash_read(RTC_OFFSET_ADR, (uint8_t *)(&g_time_offset), 4); //��ȡƫ��ֵ
+    qspi_flash_read(RTC_OFFSET_ADR, (uint8_t *)(&g_time_offset), 4);
 
-    now = now  + g_time_offset;   //����ƫ��
+    now = now  + g_time_offset;
     pTime = localtime((const time_t *)&now);
-    sprintf((char *)buf, "%04d%02d%02d%02d%02d%02d", pTime->tm_year + 1900, pTime->tm_mon + 1, pTime->tm_mday, pTime->tm_hour, pTime->tm_min, pTime->tm_sec);
-
-    int i = 16;
-
-    MyPrintf("%c ", buf[0]);
-
-    while (i-- > 2)
-    {
-        MyPrintf("%c ", buf[16 - i]);
-        if (i == 3)MyPrintf("��");
-        if (i == 5)MyPrintf("��");
-        if (i == 7)MyPrintf("ʱ");
-        if (i == 9)MyPrintf("��");
-        if (i == 11)MyPrintf("��");
-        if (i == 13)MyPrintf("��");
-    }
-    MyPrintf("\n");
-
+    MyPrintf("%04d-%02d-%02d %02d:%02d:%02d", pTime->tm_year + 1900, pTime->tm_mon + 1, pTime->tm_mday, pTime->tm_hour, pTime->tm_min, pTime->tm_sec);
     return FALSE;
 }
Index: BPU/SENSOR_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/BPU/SENSOR_TEST/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/BPU/SENSOR_TEST/prj/GCC/makefile	(working copy)
@@ -21,18 +21,19 @@
 CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
              $(LIB_PATH)/core/system \
              $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
-             $(LIB_PATH)/sdk/yc_rtc \
-             $(LIB_PATH)/sdk/yc_lpm 
-
-
-                          
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_sysctrl \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_ssc
 
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -40,22 +41,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -66,7 +215,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: BlueTooth/BNEP/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BNEP/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BNEP/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: BlueTooth/BNEP/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BNEP/prj/GCC/makefile	(revision 731)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BNEP/prj/GCC/makefile	(working copy)
@@ -26,9 +26,9 @@
              $(LIB_PATH)/sdk/yc_bt \
              $(LIB_PATH)/sdk/yc_systick \
              $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_otp \
              $(LIB_PATH)/sdk/yc_timer
 
-
              
 USER_OBJS = $(USER_PATH)/main \
             $(USER_PATH)/bt_code
@@ -39,22 +39,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
-LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap  $(LIB_PATH)/sdk/libyc_qspi.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -65,7 +213,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: BlueTooth/BNEP/user/bt_code.c
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BNEP/user/bt_code.c	(revision 731)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BNEP/user/bt_code.c	(working copy)
@@ -1,23 +1,23 @@
 const unsigned char bt_code[] = {
-0x00,0x02,0xaa,0x55,0x7e,0x1f,0xc2,0x84,0x00,0x18,0xc0,0x00,0x80,0x29,0xc0,0x03,
+0x00,0x02,0xaa,0x55,0x02,0x20,0xc2,0x84,0x00,0x18,0xc0,0x00,0x80,0x29,0xc0,0x03,
 0x80,0x2f,0xc0,0x09,0x80,0x32,0xc0,0x0b,0x80,0x35,0xc0,0x0f,0x00,0x3d,0xc0,0x13,
-0x00,0x4b,0xc0,0x2e,0x86,0x8e,0xc0,0x30,0x06,0x96,0xc0,0x34,0x80,0x65,0xc0,0x42,
-0x87,0xb4,0xc0,0x44,0x87,0xc9,0xc0,0x51,0x00,0x69,0xc0,0x5c,0x00,0x70,0xc0,0x5d,
-0x81,0x0d,0xc0,0x60,0x82,0xff,0xc0,0x64,0x03,0x13,0xc0,0x65,0x83,0x1b,0xc0,0x67,
-0x83,0x25,0xc0,0x6a,0x06,0xc3,0xc0,0x6a,0x82,0xba,0xc0,0x6d,0x86,0x9c,0xc0,0x72,
-0x06,0xb2,0x20,0x20,0x4a,0x8b,0xc0,0x01,0x87,0x47,0xc0,0x02,0x87,0x57,0xc0,0x03,
-0x07,0x60,0xc0,0x19,0x87,0x42,0xc0,0x1d,0x01,0x45,0xc0,0x1e,0x02,0xcf,0xc0,0x1e,
-0x82,0xd5,0xc0,0x1f,0x01,0x73,0xc0,0x20,0x81,0x87,0xc0,0x22,0x01,0x9d,0xc0,0x27,
-0x81,0xb3,0xc0,0x29,0x07,0xd2,0xc0,0x34,0x02,0xf3,0xc0,0x35,0x02,0xf9,0xc0,0x4c,
-0x87,0x3e,0xc0,0x51,0x81,0x94,0x20,0x20,0x4a,0x8b,0x20,0x40,0x68,0xc4,0x20,0x40,
+0x00,0x4b,0xc0,0x2e,0x86,0xa7,0xc0,0x30,0x06,0xaf,0xc0,0x34,0x80,0x65,0xc0,0x42,
+0x87,0xc9,0xc0,0x44,0x87,0xea,0xc0,0x51,0x00,0x69,0xc0,0x5c,0x00,0x70,0xc0,0x5d,
+0x81,0x0d,0xc0,0x60,0x83,0x02,0xc0,0x64,0x03,0x16,0xc0,0x65,0x83,0x1e,0xc0,0x67,
+0x83,0x28,0xc0,0x6a,0x06,0xdc,0xc0,0x6a,0x82,0xbd,0xc0,0x6d,0x86,0xb5,0xc0,0x72,
+0x06,0xcb,0x20,0x20,0x4a,0x8b,0xc0,0x01,0x87,0x5f,0xc0,0x02,0x87,0x6f,0xc0,0x03,
+0x07,0x78,0xc0,0x19,0x87,0x5a,0xc0,0x1d,0x01,0x45,0xc0,0x1e,0x02,0xd2,0xc0,0x1e,
+0x82,0xd8,0xc0,0x1f,0x01,0x73,0xc0,0x20,0x81,0x87,0xc0,0x22,0x01,0x9d,0xc0,0x27,
+0x81,0xb3,0xc0,0x29,0x07,0xf3,0xc0,0x34,0x02,0xf6,0xc0,0x35,0x02,0xfc,0xc0,0x4c,
+0x87,0x56,0xc0,0x51,0x81,0x94,0x20,0x20,0x4a,0x8b,0x20,0x40,0x68,0xc4,0x20,0x40,
 0x60,0xd7,0x20,0x40,0x00,0x2d,0x20,0x20,0x40,0x0a,0x20,0x75,0x80,0x00,0x20,0x20,
 0x7b,0x9a,0x20,0x40,0x40,0x59,0x70,0x00,0x8e,0x07,0x20,0x60,0x00,0x00,0x58,0x00,
 0x00,0x00,0x67,0xe8,0x00,0xf0,0x20,0x20,0x40,0xed,0x2c,0x20,0x06,0x03,0x24,0x60,
 0x80,0x00,0x6f,0xe2,0x00,0x8e,0x1f,0xe0,0xff,0xff,0x67,0xe2,0x00,0x8e,0x20,0x61,
 0x00,0x00,0x70,0x00,0x8e,0x07,0x20,0x20,0x41,0x1c,0x20,0x40,0x60,0xe9,0x6f,0xe2,
-0x49,0xbd,0x24,0x5a,0x46,0xb4,0x20,0x40,0x42,0xe0,0x20,0x40,0x00,0x44,0x24,0x36,
+0x49,0xbe,0x24,0x5a,0x46,0xb4,0x20,0x40,0x42,0xe0,0x20,0x40,0x00,0x44,0x24,0x36,
 0xc1,0x7c,0x20,0x20,0x41,0x77,0x6f,0xe2,0x00,0x47,0xc3,0x01,0x80,0x49,0x6f,0xe2,
-0x49,0xbd,0x24,0x5a,0x46,0xbc,0x20,0x60,0x00,0x00,0x70,0x49,0xbd,0x00,0x20,0x60,
+0x49,0xbe,0x24,0x5a,0x46,0xbc,0x20,0x60,0x00,0x00,0x70,0x49,0xbe,0x00,0x20,0x60,
 0x00,0x00,0x20,0x40,0x41,0xc5,0x24,0x74,0x00,0x00,0x78,0x54,0x7c,0x00,0x70,0x00,
 0x11,0x20,0x79,0x3f,0x80,0x0b,0x79,0x3f,0x80,0x2f,0x20,0x40,0x4a,0x4e,0x20,0x40,
 0x42,0xe2,0xc5,0x05,0x80,0x58,0x20,0x40,0x44,0x51,0x24,0x3a,0x00,0x51,0xc5,0x17,
@@ -27,38 +27,38 @@
 0xfe,0x08,0x67,0xe8,0x01,0x63,0x20,0x20,0x41,0xf4,0x6f,0xe2,0x04,0xb3,0x1f,0xe3,
 0x7e,0x00,0xc0,0x03,0xe5,0x39,0x20,0x20,0x46,0x9b,0x70,0x89,0x06,0x7c,0x20,0x75,
 0x80,0x00,0x58,0x00,0x00,0x00,0x67,0xe4,0x41,0xdd,0x1c,0x43,0x7e,0x00,0x67,0xe8,
-0x40,0x94,0x20,0x60,0x00,0x00,0x20,0x40,0x02,0xfa,0x58,0x00,0x00,0xa2,0x67,0xe4,
-0x41,0xf4,0x58,0x00,0x00,0x99,0x67,0xe4,0x41,0xf2,0x58,0x00,0x00,0xa7,0x67,0xe4,
-0x41,0xf6,0x58,0x00,0x00,0x8d,0x67,0xe4,0x41,0xfe,0x58,0x00,0x00,0x82,0x67,0xe4,
-0x45,0x41,0x58,0x00,0x07,0x2b,0x67,0xe4,0x41,0xfa,0x20,0x40,0x4d,0xaf,0x20,0x40,
-0x4d,0xbc,0x20,0x40,0x4c,0x2a,0x20,0x40,0x05,0x8f,0x20,0x20,0x50,0x4d,0x20,0x40,
+0x40,0x94,0x20,0x60,0x00,0x00,0x20,0x40,0x02,0xfd,0x58,0x00,0x00,0x9d,0x67,0xe4,
+0x41,0xf4,0x58,0x00,0x00,0x94,0x67,0xe4,0x41,0xf2,0x58,0x00,0x00,0xa2,0x67,0xe4,
+0x41,0xf6,0x58,0x00,0x00,0x87,0x67,0xe4,0x41,0xfe,0x58,0x00,0x00,0x82,0x67,0xe4,
+0x45,0x41,0x58,0x00,0x07,0x45,0x67,0xe4,0x41,0xfa,0x20,0x40,0x4d,0xaf,0x20,0x40,
+0x4d,0xbc,0x20,0x40,0x4c,0x2a,0x20,0x40,0x05,0x98,0x20,0x20,0x50,0x4d,0x20,0x40,
 0x50,0x37,0x20,0x20,0x00,0x84,0x20,0x40,0x50,0xcb,0x24,0x3a,0x00,0x84,0x20,0x60,
-0x00,0x00,0xda,0x60,0x48,0x7f,0xda,0x40,0x00,0x8a,0x20,0x20,0x4d,0x04,0x6f,0xe4,
-0x46,0x52,0xc2,0x80,0x4d,0x64,0x20,0x60,0x00,0x00,0x20,0x40,0x03,0xe1,0x20,0x40,
-0x04,0x7c,0x20,0x40,0x05,0xfa,0x20,0x40,0x06,0x46,0x20,0x40,0x00,0x93,0x20,0x20,
-0x06,0x7b,0xda,0x60,0x48,0x91,0xda,0x40,0x00,0x96,0x20,0x20,0x4d,0x04,0x6f,0xe4,
-0x46,0x52,0xc3,0x82,0x00,0x00,0x20,0x20,0x4d,0x64,0x20,0x40,0x00,0x9b,0x20,0x20,
-0x06,0x78,0x6f,0xe2,0x48,0x94,0x20,0x7a,0x00,0x00,0x70,0x48,0x94,0x00,0xda,0x20,
-0x00,0x7f,0x20,0x40,0x56,0x1a,0x68,0x44,0x48,0x92,0x20,0x20,0x06,0x74,0x20,0x40,
-0x4d,0xda,0x20,0x40,0x05,0xb8,0x20,0x40,0x04,0x6e,0xda,0x20,0x03,0xbf,0x20,0x20,
-0x04,0x40,0x1a,0x62,0x7e,0x00,0xc0,0x04,0x80,0xc2,0xc0,0x01,0x00,0xb2,0xc0,0x21,
-0x00,0xc4,0xc0,0x21,0x86,0x3d,0xc0,0x23,0x80,0xcc,0xc0,0x15,0x00,0xcd,0xc0,0x02,
-0x00,0xd1,0xc0,0x09,0x80,0xcf,0xc0,0x1e,0x80,0xd3,0x20,0x20,0x4d,0xdf,0x70,0x48,
-0x7f,0x00,0x70,0x02,0x26,0x00,0x20,0x40,0x05,0x42,0x20,0x40,0x00,0x49,0x70,0x0a,
-0xff,0x36,0x20,0x40,0x50,0x4e,0x58,0x00,0x00,0x00,0x67,0xec,0x49,0xb7,0x20,0x40,
-0x4d,0xfb,0x70,0x48,0x91,0x00,0x6f,0xe4,0x46,0x52,0xc2,0x86,0x80,0xdb,0x6f,0xe2,
-0x48,0x97,0x20,0x40,0x00,0xde,0xc1,0x00,0x00,0x00,0x20,0x20,0x00,0xf9,0x70,0x48,
-0x7f,0x06,0x20,0x20,0x4e,0x08,0x58,0x00,0x00,0x00,0x67,0xe4,0x48,0xca,0x70,0x48,
-0x9b,0x96,0x20,0x40,0x05,0x94,0x6f,0xe4,0x46,0x52,0x79,0x20,0x7e,0x0d,0x67,0xe4,
+0x00,0x00,0x20,0x40,0x06,0x8a,0x20,0x40,0x03,0xe5,0x20,0x40,0x04,0x84,0x20,0x40,
+0x06,0x03,0x20,0x40,0x06,0x4f,0x20,0x40,0x00,0x8e,0x20,0x20,0x06,0x94,0xda,0x60,
+0x48,0x90,0xda,0x40,0x00,0x91,0x20,0x20,0x4d,0x04,0x6f,0xe4,0x46,0x52,0xc3,0x82,
+0x00,0x00,0x20,0x20,0x4d,0x64,0x20,0x40,0x00,0x96,0x20,0x20,0x06,0x91,0x6f,0xe2,
+0x48,0x93,0x20,0x7a,0x00,0x00,0x70,0x48,0x93,0x00,0xda,0x20,0x00,0x7f,0x20,0x40,
+0x56,0x1a,0x68,0x44,0x48,0x91,0x20,0x20,0x06,0x8d,0x20,0x40,0x4d,0xda,0x20,0x40,
+0x05,0xc1,0x20,0x40,0x04,0x76,0xda,0x20,0x03,0xc4,0x20,0x20,0x04,0x44,0x1a,0x62,
+0x7e,0x00,0xc0,0x04,0x80,0xc3,0xc0,0x01,0x00,0xb0,0xc0,0x21,0x00,0xc4,0xc0,0x21,
+0x86,0x46,0xc0,0x23,0x80,0xcc,0xc0,0x15,0x00,0xcd,0xc0,0x02,0x00,0xd1,0xc0,0x09,
+0x80,0xcf,0xc0,0x1e,0x80,0xd3,0xc0,0x1c,0x00,0xae,0x20,0x20,0x4d,0xdf,0x70,0x49,
+0xbf,0x01,0x20,0x60,0x00,0x00,0x6f,0xe2,0x49,0xbf,0x24,0x5a,0x50,0x8e,0x70,0x49,
+0xbf,0x00,0x70,0x02,0x26,0x00,0x20,0x40,0x05,0x4a,0x20,0x40,0x06,0x87,0x20,0x40,
+0x00,0x49,0x70,0x0a,0xff,0x36,0x20,0x40,0x50,0x4e,0x58,0x00,0x00,0x00,0x67,0xec,
+0x49,0xb8,0x20,0x40,0x4d,0xfb,0x70,0x48,0x90,0x00,0x6f,0xe4,0x46,0x52,0xc2,0x86,
+0x80,0xdb,0x6f,0xe2,0x48,0x96,0x20,0x40,0x00,0xde,0xc1,0x00,0x00,0x00,0x20,0x20,
+0x00,0xf9,0x20,0x20,0x4e,0x08,0x58,0x00,0x00,0x00,0x67,0xe4,0x48,0xcb,0x70,0x48,
+0x9c,0x96,0x20,0x40,0x05,0x9d,0x6f,0xe4,0x46,0x52,0x79,0x20,0x7e,0x0d,0x67,0xe4,
 0x46,0x52,0x20,0x20,0x00,0xd8,0x20,0x20,0x00,0xf5,0x20,0x40,0x4d,0x64,0x20,0x20,
 0x00,0xf7,0x20,0x40,0x4e,0x2f,0x20,0x20,0x00,0xf0,0x20,0x40,0x4e,0x2f,0x20,0x20,
 0x00,0xf0,0x20,0x40,0x50,0x6f,0x6f,0xe4,0x46,0x52,0xc4,0x00,0x00,0x00,0x70,0x0a,
 0x95,0x26,0x20,0x20,0x7b,0xb4,0x70,0x0a,0xff,0x2c,0x20,0x20,0x50,0x4e,0x20,0x40,
 0x4d,0x64,0x20,0x40,0x00,0xde,0x70,0x0a,0xff,0x2d,0x20,0x20,0x50,0x4e,0x68,0x44,
 0x46,0x52,0x79,0x3f,0x84,0x0d,0x60,0x44,0x46,0x52,0x20,0x40,0x00,0xe4,0x60,0x48,
-0x48,0x99,0x20,0x60,0x00,0x00,0xd8,0x40,0x00,0x00,0x60,0x48,0x48,0x95,0x20,0x60,
+0x48,0x9a,0x20,0x60,0x00,0x00,0xd8,0x40,0x00,0x00,0x60,0x48,0x48,0x94,0x20,0x60,
 0x00,0x00,0x70,0x0a,0xff,0x2f,0x58,0x00,0x00,0x01,0x20,0x40,0x50,0xa5,0x6f,0xe2,
-0x49,0x17,0xe7,0xe2,0x00,0x0a,0x20,0x20,0x67,0xb9,0x20,0x40,0x05,0x44,0x70,0x0a,
+0x49,0x18,0xe7,0xe2,0x00,0x0a,0x20,0x20,0x67,0xb9,0x20,0x40,0x05,0x4c,0x70,0x0a,
 0xff,0x30,0x20,0x20,0x00,0xe8,0xda,0x20,0x00,0x00,0x20,0x20,0x00,0xfd,0x20,0x40,
 0x4d,0x64,0xda,0x20,0x00,0x01,0x20,0x20,0x00,0xfd,0xda,0x20,0x00,0x02,0x20,0x20,
 0x00,0xfd,0xda,0x20,0x00,0x03,0x20,0x20,0x00,0xfd,0xda,0x20,0x00,0x04,0x20,0x20,
@@ -68,9 +68,9 @@
 0x01,0x0b,0xda,0x20,0x00,0x05,0x20,0x20,0x01,0x0b,0xda,0x20,0x00,0x07,0x20,0x20,
 0x01,0x0b,0x70,0x0a,0xff,0x33,0x20,0x20,0x00,0xfe,0x6f,0xe2,0x0a,0xff,0xc0,0x05,
 0x81,0x23,0xc0,0x13,0x81,0x35,0xc0,0x13,0x01,0x37,0xc0,0x06,0x01,0x2c,0xc0,0x3b,
-0x06,0xe6,0xc0,0x3b,0x86,0xec,0xc0,0x3c,0x06,0xf1,0xc0,0x0a,0x81,0x20,0xc0,0x3f,
-0x01,0xb5,0xc0,0x3f,0x81,0xd9,0xc0,0x40,0x01,0xdb,0xc0,0x40,0x81,0xdd,0xc0,0x41,
-0x01,0xdf,0xc0,0x42,0x05,0x6f,0xc0,0x42,0x81,0xeb,0xc0,0x43,0x02,0x09,0xc0,0x43,
+0x07,0x01,0xc0,0x3b,0x87,0x07,0xc0,0x3c,0x07,0x0c,0xc0,0x0a,0x81,0x20,0xc0,0x3f,
+0x01,0xb5,0xc0,0x3f,0x81,0xdc,0xc0,0x40,0x01,0xde,0xc0,0x40,0x81,0xe0,0xc0,0x41,
+0x01,0xe2,0xc0,0x42,0x05,0x78,0xc0,0x42,0x81,0xee,0xc0,0x43,0x02,0x0c,0xc0,0x43,
 0x81,0x43,0x20,0x20,0x4e,0x5c,0xef,0xe6,0x00,0x03,0x67,0xe6,0x40,0xaa,0x20,0x20,
 0x50,0x1f,0x70,0x0a,0xff,0x0a,0x58,0x00,0x00,0x01,0x20,0x40,0x50,0xa5,0x20,0x40,
 0x50,0x62,0x6f,0xe4,0x46,0x52,0xd8,0xe0,0x00,0x0d,0xaf,0xef,0xff,0xff,0x79,0x20,
@@ -85,20 +85,20 @@
 0xe2,0xda,0xc0,0x0b,0xe2,0xd2,0xc0,0x08,0x81,0x71,0x20,0x20,0x60,0xfe,0x20,0x40,
 0x01,0x50,0x20,0x20,0x62,0x71,0x70,0x0a,0xff,0x37,0x58,0x00,0x00,0x26,0x20,0x40,
 0x50,0xa5,0xd8,0xc0,0x05,0x4e,0xdf,0x20,0x00,0x10,0x20,0x40,0x67,0xc1,0x6f,0xec,
-0x00,0x40,0xe7,0xec,0x00,0x0a,0xdf,0xe0,0x41,0xbf,0xdf,0x20,0x00,0x10,0x20,0x40,
+0x00,0x40,0xe7,0xec,0x00,0x0a,0xd8,0xc0,0x41,0xbf,0xdf,0x20,0x00,0x10,0x20,0x40,
 0x67,0xc1,0x20,0x20,0x67,0xb9,0x20,0x40,0x65,0x39,0x68,0x42,0x05,0x4e,0xc1,0x82,
 0x80,0x00,0x70,0x0a,0x95,0x47,0x20,0x20,0x7b,0xab,0xda,0x20,0x00,0x40,0x20,0x40,
 0x71,0x47,0x6f,0xe8,0x05,0x4e,0x68,0x48,0x05,0x8e,0x98,0x46,0x7c,0x00,0x20,0x22,
 0xe2,0x54,0x70,0x00,0x7c,0x07,0x70,0x04,0xc6,0x05,0x70,0x0a,0x95,0x47,0x20,0x20,
 0x7b,0xab,0x68,0x42,0x05,0x4e,0x18,0x46,0x7c,0x06,0x20,0x21,0x01,0x6f,0x20,0x20,
 0x62,0x06,0x70,0x00,0x7e,0x24,0x20,0x20,0x61,0x34,0x20,0x40,0x62,0xd4,0x20,0x20,
-0x06,0x4e,0x78,0x54,0x7c,0x00,0x20,0x40,0x66,0xa3,0x6f,0xe2,0x00,0x48,0x20,0x7a,
+0x06,0x57,0x78,0x54,0x7c,0x00,0x20,0x40,0x66,0xa3,0x6f,0xe2,0x00,0x48,0x20,0x7a,
 0x00,0x00,0xc2,0x83,0x81,0x7b,0xc0,0x08,0x81,0x8d,0xc0,0x03,0x81,0x8f,0x20,0x20,
 0x63,0xf2,0xc0,0x42,0x01,0x7e,0xc0,0x41,0x81,0x81,0x20,0x20,0x64,0x21,0x20,0x40,
 0x01,0x84,0x6f,0xe2,0x00,0x48,0x20,0x20,0x64,0x7b,0x20,0x40,0x01,0x84,0x6f,0xe2,
 0x00,0x48,0x20,0x20,0x64,0xef,0x6f,0xe2,0x46,0x2c,0x20,0x3a,0x65,0x0d,0x20,0x20,
 0x65,0x06,0x6f,0xe2,0x40,0x9e,0x79,0x3f,0xfe,0x03,0x67,0xe2,0x40,0x9e,0x58,0x00,
-0x00,0x01,0x67,0xe4,0x04,0xca,0x20,0x60,0x00,0x00,0x70,0x49,0xbd,0x01,0x20,0x20,
+0x00,0x01,0x67,0xe4,0x04,0xca,0x20,0x60,0x00,0x00,0x70,0x49,0xbe,0x01,0x20,0x20,
 0x66,0x6a,0x18,0x00,0x7e,0x02,0x20,0x40,0x66,0x7a,0x6f,0xe2,0x04,0xc6,0xe7,0xe2,
 0x00,0x05,0x20,0x20,0x66,0x94,0x20,0x40,0x66,0x9e,0x24,0x3a,0x7b,0xfd,0x6f,0xe2,
 0x0a,0x95,0xc5,0x84,0xfb,0xf8,0xc0,0x13,0x01,0x9a,0x20,0x20,0x7b,0xec,0x70,0x00,
@@ -109,492 +109,501 @@
 0x80,0x00,0xc4,0x01,0x00,0x00,0x6f,0xe8,0x04,0xe5,0xd8,0x40,0x01,0x90,0x98,0x40,
 0x84,0x00,0x1c,0x42,0x7e,0x00,0x98,0x46,0x7c,0x00,0x24,0x61,0x00,0x00,0x20,0x20,
 0x67,0x2b,0x20,0x40,0x68,0xa5,0x20,0x20,0x4d,0x8d,0x6f,0xe4,0x46,0x52,0xc2,0x86,
-0xd0,0x1c,0xc2,0x80,0x50,0x1c,0xef,0xec,0x00,0x03,0x20,0x3a,0x01,0xc3,0x67,0xec,
+0xd0,0x1c,0xc2,0x80,0x01,0xc3,0xef,0xec,0x00,0x03,0x20,0x3a,0x01,0xc6,0x67,0xec,
 0x41,0xd1,0xef,0xf0,0x00,0x03,0x67,0xf0,0x41,0xbf,0xef,0xf0,0x00,0x03,0xe7,0xf0,
 0x00,0x05,0x20,0x40,0x68,0xbe,0x20,0x40,0x4e,0x33,0x20,0x40,0x4d,0x5c,0x20,0x20,
-0x50,0x1f,0x20,0x40,0x01,0xcb,0x24,0x34,0x50,0x1c,0xef,0xec,0x00,0x06,0x67,0xec,
-0x41,0xd1,0x18,0xc0,0x8c,0x0a,0xd8,0xa0,0x41,0xbf,0x20,0x40,0x7c,0x9a,0x20,0x20,
-0x01,0xbf,0x20,0x40,0x7d,0xc1,0xd8,0x40,0x33,0x00,0xdf,0x20,0x00,0x05,0xda,0x20,
-0x47,0xd5,0xef,0xe4,0x00,0x11,0x98,0x46,0x7c,0x00,0x20,0x22,0xfd,0xbf,0x1a,0x20,
-0xa2,0x22,0xc2,0x00,0x01,0xcf,0x18,0x40,0x84,0x01,0x58,0x00,0x33,0x05,0x98,0x46,
-0x7c,0x00,0x24,0x22,0x81,0xcd,0x20,0x60,0x00,0x00,0xda,0x20,0x03,0x8b,0x20,0x20,
-0x05,0x4a,0xda,0x20,0x03,0x9b,0x20,0x20,0x05,0x4a,0xda,0x20,0x03,0xa1,0x20,0x20,
-0x05,0x4a,0x6f,0xe4,0x46,0x52,0xc3,0x06,0xd0,0x1c,0x6f,0xe2,0x48,0x9c,0x1f,0xe6,
-0x7c,0x04,0x20,0x21,0x50,0x1c,0x6f,0xe2,0x0b,0x00,0x67,0xe2,0x48,0xce,0x1f,0xe2,
-0x72,0x00,0xd8,0xa0,0x48,0xcf,0x20,0x40,0x67,0xda,0x20,0x40,0x06,0x26,0x20,0x20,
-0x50,0x1f,0x68,0x42,0x0b,0x00,0x18,0x42,0x72,0x00,0x6f,0xe4,0x49,0xb1,0x9f,0x20,
-0x84,0x00,0x60,0x44,0x49,0xb1,0xd8,0xa0,0x49,0xf3,0x98,0xa0,0x8a,0x00,0x20,0x40,
-0x67,0xda,0x20,0x40,0x50,0x1f,0xda,0x20,0x00,0x01,0x6f,0xe4,0x49,0xf4,0x1f,0xe0,
-0xfe,0x05,0x68,0x44,0x49,0xb1,0x98,0x46,0x7c,0x00,0x24,0x21,0x01,0xfe,0x24,0x62,
-0x80,0x00,0xda,0x20,0x00,0x00,0x20,0x40,0x01,0xfe,0x20,0x20,0x02,0x04,0x70,0x0a,
-0xff,0x3a,0x20,0x40,0x00,0xfe,0x20,0x20,0x02,0x01,0x58,0x00,0x00,0x00,0x67,0xe4,
-0x49,0xb1,0x20,0x60,0x00,0x00,0x68,0x42,0x49,0xf3,0x18,0x46,0x7c,0x80,0x20,0x22,
-0x85,0x7e,0xda,0x20,0x04,0x60,0x20,0x20,0x04,0x47,0x20,0x40,0x02,0x01,0x20,0x20,
-0x50,0x1f,0xda,0x20,0x00,0x01,0x58,0x00,0x00,0x00,0x67,0xec,0x49,0xed,0x70,0x0a,
-0xff,0x3b,0x20,0x20,0x00,0xfe,0x70,0x0a,0xff,0x39,0x20,0x20,0x02,0x13,0x70,0x0a,
-0xff,0x31,0x6f,0xe4,0x49,0x11,0x20,0x7a,0x00,0x00,0xd8,0x40,0x00,0xd2,0x20,0x40,
-0x7d,0xb5,0x1f,0xe2,0x26,0x00,0x1f,0xe0,0xfe,0x01,0x20,0x40,0x50,0xa5,0x6f,0xe2,
-0x49,0x17,0xe7,0xe2,0x00,0x0a,0x1a,0x62,0x72,0x00,0x6f,0xe4,0x49,0x13,0x1f,0xe2,
-0x0c,0x00,0x20,0x40,0x67,0xc1,0x18,0xc2,0x7e,0x00,0x67,0xe4,0x49,0x13,0x20,0x40,
-0x67,0xb9,0x20,0x40,0x00,0x84,0x6f,0xe4,0x49,0x11,0x9a,0x66,0x7e,0x00,0x67,0xe4,
-0x49,0x11,0x20,0x20,0x02,0x13,0xd8,0xe0,0x00,0x0e,0x20,0x20,0x7c,0xf1,0xd8,0xe0,
-0x00,0x0e,0x20,0x20,0x7c,0xe3,0xd8,0x40,0x00,0x00,0x20,0x40,0x02,0x5d,0x1a,0x22,
-0x0c,0x00,0xdf,0x20,0x00,0x04,0x20,0x40,0x02,0x69,0x1a,0x20,0x8d,0xfd,0xef,0xe2,
-0x00,0x06,0x1f,0xed,0x7e,0x00,0x98,0x40,0x84,0x00,0x1a,0x20,0x8d,0xf6,0xef,0xe4,
-0x00,0x06,0x1f,0xf0,0xfe,0x00,0x1f,0xe0,0xff,0xec,0x2f,0xec,0x00,0x00,0x1f,0xe3,
-0x72,0x00,0x1f,0xf0,0xfe,0x00,0x98,0x40,0x84,0x00,0x1a,0x20,0x8c,0x08,0x20,0x40,
-0x02,0x69,0x20,0x20,0x82,0x42,0xef,0xe2,0x00,0x06,0x98,0x40,0x84,0x00,0x20,0x40,
-0x02,0x60,0x20,0x20,0x02,0x5d,0xda,0x40,0x00,0x18,0x20,0x20,0x02,0x2c,0xda,0x40,
-0x00,0x0e,0x20,0x20,0x02,0x2c,0xd8,0x40,0x00,0x00,0x60,0x44,0x48,0xb0,0xd8,0xc0,
-0x48,0xa6,0xdf,0x20,0x00,0x0a,0x20,0x40,0x02,0x69,0x20,0x40,0x02,0x60,0x60,0x44,
-0x48,0xb0,0x20,0x60,0x00,0x00,0x20,0x40,0x02,0x5a,0x98,0x00,0x26,0x00,0x20,0x40,
-0x02,0x2c,0x58,0x00,0xff,0xff,0x98,0x41,0x7e,0x00,0x9a,0x66,0x7c,0x00,0x20,0x60,
-0x00,0x00,0x1a,0x42,0x7e,0x00,0x9a,0x20,0x8a,0x00,0x20,0x60,0x00,0x00,0x20,0x40,
-0x02,0x57,0xef,0xe4,0x00,0x05,0x20,0x60,0x00,0x00,0x20,0x40,0x02,0x57,0xe0,0x44,
-0x00,0x05,0x20,0x60,0x00,0x00,0x20,0x40,0x02,0x64,0x20,0x40,0x02,0x64,0x18,0x44,
-0x04,0x00,0x20,0x60,0x00,0x00,0x58,0x00,0xff,0xff,0x98,0x41,0x7e,0x00,0x18,0x51,
-0x04,0x00,0x98,0x40,0x84,0x00,0x20,0x60,0x00,0x00,0xef,0xe4,0x00,0x06,0x98,0x40,
-0x84,0x00,0xc2,0x00,0x02,0x69,0x20,0x60,0x00,0x00,0x20,0x40,0x56,0x1a,0x1f,0xe2,
-0x0a,0x00,0x1a,0x22,0x7e,0x00,0xe7,0xe4,0x00,0x05,0x6f,0xe4,0x48,0x95,0xe7,0xe4,
-0x00,0x05,0x20,0x60,0x00,0x00,0x6f,0xec,0x49,0xb7,0x24,0x3a,0x02,0x78,0x18,0x40,
-0xa2,0x17,0x20,0x60,0x00,0x00,0x18,0x40,0xa2,0x1d,0x20,0x60,0x00,0x00,0x18,0x50,
-0xfe,0x00,0x67,0xe4,0x48,0xbe,0x18,0x40,0xfe,0x14,0x1f,0xf0,0xfe,0x00,0x67,0xe4,
-0x48,0xa8,0x6f,0xe4,0x48,0xaa,0x1f,0xf0,0xfe,0x00,0x1f,0xe0,0xfe,0x01,0x1f,0xf0,
-0xfe,0x00,0x67,0xe4,0x48,0xaa,0x20,0x40,0x02,0x48,0x20,0x20,0x02,0x6d,0x6f,0xec,
-0x49,0xb7,0x20,0x3a,0x02,0x90,0x58,0x00,0x00,0x04,0xe7,0xe2,0x00,0x05,0x6f,0xec,
-0x49,0xb7,0xe7,0xec,0x00,0x05,0x58,0x00,0x00,0x08,0xe7,0xe4,0x00,0x05,0x18,0xa0,
-0xa2,0x0c,0x20,0x60,0x00,0x00,0x58,0x00,0x00,0x02,0xe7,0xe2,0x00,0x05,0x20,0x20,
-0x02,0x8c,0x20,0x40,0x02,0x74,0x70,0x48,0xaf,0x11,0x20,0x40,0x02,0x7a,0x20,0x40,
-0x02,0x86,0xd8,0xc0,0x48,0xa6,0xdf,0x20,0x00,0x1c,0x20,0x20,0x7c,0xcf,0x20,0x40,
-0x02,0x74,0x70,0x48,0xaf,0x06,0x20,0x40,0x02,0x7c,0x20,0x40,0x02,0x86,0xd8,0xc0,
-0x48,0xa6,0xdf,0x20,0x00,0x14,0x20,0x20,0x7c,0xcf,0x1f,0xef,0x04,0x00,0x20,0x40,
-0x02,0xa8,0x18,0x50,0x84,0x00,0x1f,0xf0,0x7e,0x00,0x98,0x41,0xfe,0x00,0xe7,0xec,
-0x00,0x05,0x20,0x60,0x00,0x00,0x1f,0xf1,0x0c,0x00,0x18,0xd0,0x8c,0x00,0x1f,0xf0,
-0xfe,0x00,0x1f,0xf0,0x7e,0x00,0x98,0xc1,0xfe,0x00,0x20,0x60,0x00,0x00,0x20,0x40,
-0x02,0xa8,0x98,0x40,0xfe,0x00,0x20,0x20,0x02,0xa8,0x6f,0xe8,0x49,0xa3,0x67,0xe8,
-0x48,0xb2,0x20,0x60,0x00,0x00,0x20,0x40,0x02,0xb1,0x6f,0xe8,0x49,0x2d,0x67,0xe8,
-0x48,0xb6,0x20,0x60,0x00,0x00,0x20,0x40,0x02,0x46,0x20,0x20,0x51,0xd6,0x20,0x40,
-0x56,0x4b,0x24,0x7a,0x00,0x00,0x20,0x40,0x56,0x92,0x18,0x00,0x24,0x00,0x20,0x40,
-0x56,0x9d,0x1f,0xe2,0x0a,0x00,0x6f,0xe4,0x02,0x62,0x1f,0xe2,0x26,0x00,0x6f,0xe4,
-0x02,0x60,0x98,0x00,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc0,0x01,0x86,0x5a,0xc0,0x02,
-0x06,0x63,0xc0,0x02,0xd1,0xd5,0xc0,0x03,0x02,0xdc,0x20,0x40,0x54,0xe3,0x1a,0x60,
-0xa7,0xfc,0x24,0x22,0x82,0xc4,0x1a,0x42,0x04,0x00,0x20,0x40,0x54,0xb8,0x20,0x20,
-0x51,0xd6,0x6f,0xe2,0x05,0x4e,0x67,0xe2,0x04,0xc5,0xc0,0x08,0x82,0xd3,0x20,0x20,
-0x61,0x95,0x20,0x40,0x61,0xd7,0x20,0x20,0x06,0x4e,0x6f,0xe2,0x05,0x4e,0x67,0xe2,
-0x04,0xc5,0xc0,0x05,0x82,0xd9,0x20,0x20,0x61,0xa6,0xda,0x20,0x00,0x06,0x20,0x40,
-0x00,0xfd,0x20,0x20,0x61,0xdf,0xef,0xe2,0x00,0x06,0x1f,0xe2,0x0e,0x00,0xef,0xe4,
-0x00,0x06,0x1f,0xe2,0x22,0x00,0x1a,0x62,0x7e,0x00,0x9a,0x26,0x26,0x00,0xef,0xe4,
-0x00,0x06,0x1f,0xe2,0x22,0x00,0xef,0xe4,0x00,0x06,0x1f,0xe2,0x16,0x00,0x20,0x40,
-0x7c,0x83,0x58,0x00,0x00,0x48,0x1a,0x22,0x04,0x00,0x98,0x46,0x7c,0x00,0x20,0x22,
-0x86,0x82,0x58,0x00,0x00,0x50,0x1a,0x22,0x04,0x00,0x98,0x46,0x7c,0x00,0x20,0x22,
-0x82,0xf0,0x20,0x20,0x55,0xc7,0x20,0x40,0x55,0xd4,0x70,0x48,0x91,0x64,0x20,0x60,
-0x00,0x00,0x6f,0xe4,0x41,0xdd,0x20,0x3a,0x4a,0x8b,0xd8,0x40,0x01,0x04,0x98,0x46,
-0x7e,0x00,0x20,0x22,0xeb,0xa8,0x20,0x20,0x6b,0xa1,0x20,0x60,0x00,0x00,0x58,0x00,
-0x0d,0x03,0x67,0xe4,0x49,0x71,0x58,0x00,0x0b,0x1e,0x67,0xe4,0x49,0x49,0x20,0x20,
-0x05,0x42,0x6f,0xe2,0x02,0x64,0xc0,0x24,0x83,0x02,0x20,0x20,0x51,0x63,0x6f,0xe4,
-0x02,0x60,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0x80,0x80,0x00,0xef,0xe2,
-0x00,0x06,0xc1,0x80,0x80,0x00,0xda,0x20,0x00,0x7f,0x20,0x40,0x56,0x1a,0x1f,0xe2,
-0x0a,0x00,0x58,0x00,0x00,0x04,0xe7,0xe4,0x00,0x05,0x6f,0xe4,0x48,0x92,0xe7,0xe4,
-0x00,0x05,0x58,0x00,0x02,0x01,0xe7,0xe8,0x00,0x05,0x70,0x48,0x91,0x02,0x20,0x20,
-0x51,0xd6,0x18,0x42,0x7e,0x00,0xc0,0x07,0x83,0x16,0x20,0x20,0x52,0x38,0x20,0x40,
-0x7c,0x83,0x19,0x62,0x7e,0x00,0x67,0xe4,0x48,0x92,0xd8,0x40,0x00,0x49,0x20,0x20,
-0x52,0x8b,0x58,0x00,0x00,0x49,0x98,0x46,0x7c,0x00,0x20,0x22,0x83,0x1f,0x20,0x20,
-0x52,0xe9,0xd9,0x60,0x00,0x49,0x6f,0xe4,0x48,0x92,0x1f,0xe2,0x04,0x00,0x20,0x40,
-0x53,0x1d,0x70,0x48,0x94,0x01,0x20,0x60,0x00,0x00,0x58,0x00,0x00,0x50,0x98,0x46,
-0x7c,0x00,0x20,0x22,0x83,0x29,0x20,0x20,0x53,0xb2,0x20,0x40,0x53,0xcc,0x70,0x48,
-0x91,0x64,0x20,0x60,0x00,0x00,0xef,0xe4,0x00,0x06,0x1f,0xf0,0xfe,0x00,0x1f,0xe6,
-0x7c,0x01,0x24,0x22,0xd1,0xd6,0xef,0xe4,0x00,0x06,0xc0,0x84,0x51,0xd6,0xef,0xe2,
-0x00,0x06,0xc0,0x83,0x51,0xd6,0xef,0xe2,0x00,0x06,0xc0,0x82,0x51,0xd6,0xef,0xe4,
-0x00,0x06,0x1f,0xf0,0xfe,0x00,0xc0,0x00,0x83,0x3b,0xc0,0x01,0x03,0x45,0x20,0x20,
-0x51,0xd6,0x18,0xc2,0x22,0x00,0x18,0xc0,0x8c,0x10,0xef,0xe8,0x00,0x06,0x68,0x48,
-0x49,0xa3,0x98,0x46,0x7c,0x00,0x24,0x22,0xd1,0xd6,0x1a,0x22,0x0c,0x00,0xef,0xec,
-0x00,0x06,0x67,0xec,0x49,0xa7,0x20,0x20,0x03,0x5b,0x6f,0xe2,0x48,0x9c,0xc0,0x82,
-0xd1,0xd6,0x20,0x40,0x01,0x07,0x70,0x48,0x9c,0x06,0x20,0x20,0x51,0xd6,0x58,0x00,
-0x00,0x00,0x67,0xec,0x49,0xa7,0x70,0x48,0x9c,0x05,0x70,0x49,0xa2,0x01,0xda,0x20,
-0x00,0x25,0x20,0x40,0x02,0x6d,0x6f,0xee,0x48,0x9d,0xe7,0xee,0x00,0x05,0xd8,0xc0,
-0x49,0x99,0xdf,0x20,0x00,0x0a,0x20,0x40,0x7c,0xcf,0x6f,0xec,0x40,0xa0,0x20,0x40,
-0x02,0xa1,0xd8,0xc0,0x49,0xa3,0xdf,0x20,0x00,0x0e,0x20,0x40,0x7c,0xcf,0x20,0x20,
-0x51,0xd6,0x70,0x49,0xa2,0x02,0x6f,0xe2,0x0b,0x0e,0xc0,0x01,0x03,0x66,0xc0,0x00,
-0x03,0x6b,0xda,0x20,0x00,0x25,0x20,0x40,0x02,0x6d,0x58,0x00,0x00,0x04,0xe7,0xe2,
-0x00,0x05,0x6f,0xec,0x49,0xa7,0x20,0x40,0x02,0xa1,0x20,0x20,0x03,0x52,0xda,0x20,
-0x00,0x1f,0x20,0x40,0x02,0x6d,0x58,0x00,0x00,0x02,0xe7,0xe2,0x00,0x05,0x20,0x20,
-0x03,0x52,0xda,0x20,0x00,0x25,0x20,0x40,0x02,0x6d,0x58,0x00,0x00,0x04,0xe7,0xe2,
-0x00,0x05,0x6f,0xec,0x49,0xb7,0xe7,0xec,0x00,0x05,0x20,0x20,0x03,0x52,0x18,0xc0,
-0x8c,0x02,0xef,0xe4,0x00,0x06,0x1f,0xf0,0xa6,0x00,0xe8,0x44,0x00,0x06,0xef,0xe4,
-0x00,0x06,0xda,0x40,0xff,0x1f,0x9a,0x41,0x7e,0x00,0x7d,0x3a,0x00,0x31,0x18,0xc0,
-0x8c,0x01,0xef,0xe2,0x00,0x06,0x18,0xc0,0xa2,0x02,0xc0,0x00,0x83,0x81,0xc0,0x03,
-0x04,0x91,0xc0,0x08,0x85,0x51,0x20,0x20,0x51,0xd6,0x20,0x40,0x51,0xd6,0x68,0x48,
-0x49,0xa3,0x1a,0x20,0x8c,0x04,0xef,0xe8,0x00,0x06,0x98,0x46,0x7c,0x00,0x24,0x62,
-0x80,0x00,0xef,0xe4,0x00,0x06,0xc1,0x81,0x80,0x00,0xda,0x20,0x00,0x02,0x20,0x20,
-0x03,0xfd,0x6f,0xe2,0x49,0x18,0xc0,0x80,0x50,0x1c,0x68,0x42,0x0a,0x9e,0x60,0x42,
-0x49,0x17,0xef,0xe8,0x00,0x03,0x67,0xe8,0x49,0x2d,0xef,0xe4,0x00,0x03,0x67,0xe4,
-0x49,0x33,0x70,0x49,0x2c,0x19,0x20,0x40,0x05,0x13,0x6f,0xe2,0x0b,0x00,0xc0,0x03,
-0xd0,0x1f,0xef,0xe4,0x00,0x03,0x67,0xe4,0x49,0x1a,0x20,0x40,0x50,0x1f,0x20,0x20,
-0x04,0x3d,0x6f,0xe2,0x49,0x18,0xc0,0x81,0xd0,0x1c,0x70,0x49,0x2c,0x19,0x20,0x40,
-0x04,0x59,0x20,0x40,0x05,0x0f,0x20,0x20,0x50,0x1f,0x6f,0xe2,0x49,0x18,0xc0,0x81,
-0xd0,0x1c,0x70,0x0b,0x01,0x00,0x6f,0xe4,0x49,0x15,0x67,0xe4,0x48,0x8f,0x6f,0xe2,
-0x49,0x21,0x24,0x7a,0x00,0x00,0x20,0x40,0x07,0xac,0x20,0x7a,0x00,0x00,0x70,0x0b,
-0x01,0x01,0x6f,0xe2,0x0b,0x00,0x1f,0xe6,0x7c,0xec,0x24,0x21,0x50,0x1c,0x1f,0xe0,
-0x85,0xff,0x18,0x42,0x72,0x00,0x60,0x44,0x49,0x11,0x6f,0xe8,0x49,0x35,0x20,0x40,
-0x02,0xa8,0x67,0xe8,0x03,0x0d,0xe0,0x42,0x00,0x05,0x20,0x40,0x67,0xda,0xda,0x20,
-0x03,0x0d,0x20,0x40,0x07,0x80,0x58,0x00,0x03,0x12,0x67,0xe4,0x49,0x13,0x20,0x40,
-0x05,0x07,0x6f,0xe2,0x0b,0x00,0x1f,0xe0,0x85,0xff,0x20,0x40,0x04,0x5c,0x20,0x20,
-0x50,0x1f,0x6f,0xe8,0x49,0x26,0x68,0x48,0x49,0x22,0x98,0x46,0x7c,0x00,0x20,0x61,
-0x00,0x00,0x60,0x48,0x49,0x26,0x6f,0xe2,0x49,0x21,0xc0,0x80,0x03,0xd3,0x6f,0xe4,
-0x49,0x15,0x67,0xe4,0x48,0x8f,0x20,0x40,0x07,0xa8,0x20,0x3a,0x03,0xdc,0xda,0x20,
-0x03,0x0d,0x20,0x40,0x07,0x97,0x68,0x48,0x03,0x0d,0xef,0xe2,0x00,0x06,0x98,0x40,
-0x84,0x00,0x6f,0xe8,0x49,0x26,0x98,0x46,0x7c,0x00,0x20,0x22,0x83,0xdc,0x20,0x20,
-0x03,0xc6,0x6f,0xe4,0x49,0x1e,0x1f,0xe2,0x22,0x00,0xe8,0x48,0x00,0x11,0xef,0xe2,
-0x00,0x06,0x98,0x40,0x84,0x00,0x6f,0xe8,0x49,0x26,0x98,0x46,0x7c,0x00,0x20,0x22,
-0x83,0xdf,0x20,0x20,0x03,0xc6,0x70,0x49,0x21,0x00,0x70,0x49,0x20,0x00,0x20,0x60,
-0x00,0x00,0x70,0x49,0x21,0x02,0x20,0x60,0x00,0x00,0xda,0x20,0x03,0xe3,0x20,0x20,
-0x04,0x40,0x20,0x40,0x03,0xe8,0x20,0x40,0x03,0xff,0x20,0x40,0x04,0x0a,0x20,0x40,
-0x04,0x0e,0x20,0x20,0x04,0x37,0xda,0x60,0x49,0x2c,0xda,0x40,0x03,0xeb,0x20,0x20,
-0x4d,0x04,0x6f,0xe2,0x49,0x18,0xc0,0x00,0x83,0xf0,0xc0,0x02,0x83,0xf2,0xc0,0x03,
-0x03,0xf2,0x20,0x60,0x00,0x00,0xda,0x20,0x00,0x00,0x20,0x20,0x03,0xf4,0xda,0x20,
-0x00,0x03,0x20,0x20,0x03,0xf4,0x20,0x40,0x05,0x44,0x70,0x0a,0xff,0x32,0x58,0x00,
+0x50,0x1f,0x20,0x40,0x50,0x1c,0xda,0x20,0x00,0x08,0x20,0x20,0x00,0xfd,0x20,0x40,
+0x01,0xce,0x24,0x34,0x50,0x1c,0xef,0xec,0x00,0x06,0x67,0xec,0x41,0xd1,0x18,0xc0,
+0x8c,0x0a,0xd8,0xa0,0x41,0xbf,0x20,0x40,0x7c,0x9a,0x20,0x20,0x01,0xbf,0x20,0x40,
+0x7d,0xc1,0xd8,0x40,0x33,0x00,0xdf,0x20,0x00,0x05,0xda,0x20,0x47,0xd5,0xef,0xe4,
+0x00,0x11,0x98,0x46,0x7c,0x00,0x20,0x22,0xfd,0xbf,0x1a,0x20,0xa2,0x22,0xc2,0x00,
+0x01,0xd2,0x18,0x40,0x84,0x01,0x58,0x00,0x33,0x05,0x98,0x46,0x7c,0x00,0x24,0x22,
+0x81,0xd0,0x20,0x60,0x00,0x00,0xda,0x20,0x03,0x90,0x20,0x20,0x05,0x52,0xda,0x20,
+0x03,0xa0,0x20,0x20,0x05,0x52,0xda,0x20,0x03,0xa6,0x20,0x20,0x05,0x52,0x6f,0xe4,
+0x46,0x52,0xc3,0x06,0xd0,0x1c,0x6f,0xe2,0x48,0x9d,0x1f,0xe6,0x7c,0x04,0x20,0x21,
+0x50,0x1c,0x6f,0xe2,0x0b,0x00,0x67,0xe2,0x48,0xcf,0x1f,0xe2,0x72,0x00,0xd8,0xa0,
+0x48,0xd0,0x20,0x40,0x67,0xda,0x20,0x40,0x06,0x2f,0x20,0x20,0x50,0x1f,0x68,0x42,
+0x0b,0x00,0x18,0x42,0x72,0x00,0x6f,0xe4,0x49,0xb2,0x9f,0x20,0x84,0x00,0x60,0x44,
+0x49,0xb2,0xd8,0xa0,0x49,0xf5,0x98,0xa0,0x8a,0x00,0x20,0x40,0x67,0xda,0x20,0x40,
+0x50,0x1f,0xda,0x20,0x00,0x01,0x6f,0xe4,0x49,0xf6,0x1f,0xe0,0xfe,0x05,0x68,0x44,
+0x49,0xb2,0x98,0x46,0x7c,0x00,0x24,0x21,0x02,0x01,0x24,0x62,0x80,0x00,0xda,0x20,
+0x00,0x00,0x20,0x40,0x02,0x01,0x20,0x20,0x02,0x07,0x70,0x0a,0xff,0x3a,0x20,0x40,
+0x00,0xfe,0x20,0x20,0x02,0x04,0x58,0x00,0x00,0x00,0x67,0xe4,0x49,0xb2,0x20,0x60,
+0x00,0x00,0x68,0x42,0x49,0xf5,0x18,0x46,0x7c,0x80,0x20,0x22,0x85,0x87,0xda,0x20,
+0x04,0x64,0x20,0x20,0x04,0x4b,0x20,0x40,0x02,0x04,0x20,0x20,0x50,0x1f,0xda,0x20,
+0x00,0x01,0x58,0x00,0x00,0x00,0x67,0xec,0x49,0xef,0x70,0x0a,0xff,0x3b,0x20,0x20,
+0x00,0xfe,0x70,0x0a,0xff,0x39,0x20,0x20,0x02,0x16,0x70,0x0a,0xff,0x31,0x6f,0xe4,
+0x49,0x12,0x20,0x7a,0x00,0x00,0xd8,0x40,0x00,0xd2,0x20,0x40,0x7d,0xb5,0x1f,0xe2,
+0x26,0x00,0x1f,0xe0,0xfe,0x01,0x20,0x40,0x50,0xa5,0x6f,0xe2,0x49,0x18,0xe7,0xe2,
+0x00,0x0a,0x1a,0x62,0x72,0x00,0x6f,0xe4,0x49,0x14,0x1f,0xe2,0x0c,0x00,0x20,0x40,
+0x67,0xc1,0x18,0xc2,0x7e,0x00,0x67,0xe4,0x49,0x14,0x20,0x40,0x67,0xb9,0x20,0x40,
+0x00,0x84,0x6f,0xe4,0x49,0x12,0x9a,0x66,0x7e,0x00,0x67,0xe4,0x49,0x12,0x20,0x20,
+0x02,0x16,0xd8,0xe0,0x00,0x0e,0x20,0x20,0x7c,0xf1,0xd8,0xe0,0x00,0x0e,0x20,0x20,
+0x7c,0xe3,0xd8,0x40,0x00,0x00,0x20,0x40,0x02,0x60,0x1a,0x22,0x0c,0x00,0xdf,0x20,
+0x00,0x04,0x20,0x40,0x02,0x6c,0x1a,0x20,0x8d,0xfd,0xef,0xe2,0x00,0x06,0x1f,0xed,
+0x7e,0x00,0x98,0x40,0x84,0x00,0x1a,0x20,0x8d,0xf6,0xef,0xe4,0x00,0x06,0x1f,0xf0,
+0xfe,0x00,0x1f,0xe0,0xff,0xec,0x2f,0xec,0x00,0x00,0x1f,0xe3,0x72,0x00,0x1f,0xf0,
+0xfe,0x00,0x98,0x40,0x84,0x00,0x1a,0x20,0x8c,0x08,0x20,0x40,0x02,0x6c,0x20,0x20,
+0x82,0x45,0xef,0xe2,0x00,0x06,0x98,0x40,0x84,0x00,0x20,0x40,0x02,0x63,0x20,0x20,
+0x02,0x60,0xda,0x40,0x00,0x18,0x20,0x20,0x02,0x2f,0xda,0x40,0x00,0x0e,0x20,0x20,
+0x02,0x2f,0xd8,0x40,0x00,0x00,0x60,0x44,0x48,0xb1,0xd8,0xc0,0x48,0xa7,0xdf,0x20,
+0x00,0x0a,0x20,0x40,0x02,0x6c,0x20,0x40,0x02,0x63,0x60,0x44,0x48,0xb1,0x20,0x60,
+0x00,0x00,0x20,0x40,0x02,0x5d,0x98,0x00,0x26,0x00,0x20,0x40,0x02,0x2f,0x58,0x00,
+0xff,0xff,0x98,0x41,0x7e,0x00,0x9a,0x66,0x7c,0x00,0x20,0x60,0x00,0x00,0x1a,0x42,
+0x7e,0x00,0x9a,0x20,0x8a,0x00,0x20,0x60,0x00,0x00,0x20,0x40,0x02,0x5a,0xef,0xe4,
+0x00,0x05,0x20,0x60,0x00,0x00,0x20,0x40,0x02,0x5a,0xe0,0x44,0x00,0x05,0x20,0x60,
+0x00,0x00,0x20,0x40,0x02,0x67,0x20,0x40,0x02,0x67,0x18,0x44,0x04,0x00,0x20,0x60,
+0x00,0x00,0x58,0x00,0xff,0xff,0x98,0x41,0x7e,0x00,0x18,0x51,0x04,0x00,0x98,0x40,
+0x84,0x00,0x20,0x60,0x00,0x00,0xef,0xe4,0x00,0x06,0x98,0x40,0x84,0x00,0xc2,0x00,
+0x02,0x6c,0x20,0x60,0x00,0x00,0x20,0x40,0x56,0x1a,0x1f,0xe2,0x0a,0x00,0x1a,0x22,
+0x7e,0x00,0xe7,0xe4,0x00,0x05,0x6f,0xe4,0x48,0x94,0xe7,0xe4,0x00,0x05,0x20,0x60,
+0x00,0x00,0x6f,0xec,0x49,0xb8,0x24,0x3a,0x02,0x7b,0x18,0x40,0xa2,0x17,0x20,0x60,
+0x00,0x00,0x18,0x40,0xa2,0x1d,0x20,0x60,0x00,0x00,0x18,0x50,0xfe,0x00,0x67,0xe4,
+0x48,0xbf,0x18,0x40,0xfe,0x14,0x1f,0xf0,0xfe,0x00,0x67,0xe4,0x48,0xa9,0x6f,0xe4,
+0x48,0xab,0x1f,0xf0,0xfe,0x00,0x1f,0xe0,0xfe,0x01,0x1f,0xf0,0xfe,0x00,0x67,0xe4,
+0x48,0xab,0x20,0x40,0x02,0x4b,0x20,0x20,0x02,0x70,0x6f,0xec,0x49,0xb8,0x20,0x3a,
+0x02,0x93,0x58,0x00,0x00,0x04,0xe7,0xe2,0x00,0x05,0x6f,0xec,0x49,0xb8,0xe7,0xec,
+0x00,0x05,0x58,0x00,0x00,0x08,0xe7,0xe4,0x00,0x05,0x18,0xa0,0xa2,0x0c,0x20,0x60,
+0x00,0x00,0x58,0x00,0x00,0x02,0xe7,0xe2,0x00,0x05,0x20,0x20,0x02,0x8f,0x20,0x40,
+0x02,0x77,0x70,0x48,0xb0,0x11,0x20,0x40,0x02,0x7d,0x20,0x40,0x02,0x89,0xd8,0xc0,
+0x48,0xa7,0xdf,0x20,0x00,0x1c,0x20,0x20,0x7c,0xcf,0x20,0x40,0x02,0x77,0x70,0x48,
+0xb0,0x06,0x20,0x40,0x02,0x7f,0x20,0x40,0x02,0x89,0xd8,0xc0,0x48,0xa7,0xdf,0x20,
+0x00,0x14,0x20,0x20,0x7c,0xcf,0x1f,0xef,0x04,0x00,0x20,0x40,0x02,0xab,0x18,0x50,
+0x84,0x00,0x1f,0xf0,0x7e,0x00,0x98,0x41,0xfe,0x00,0xe7,0xec,0x00,0x05,0x20,0x60,
+0x00,0x00,0x1f,0xf1,0x0c,0x00,0x18,0xd0,0x8c,0x00,0x1f,0xf0,0xfe,0x00,0x1f,0xf0,
+0x7e,0x00,0x98,0xc1,0xfe,0x00,0x20,0x60,0x00,0x00,0x20,0x40,0x02,0xab,0x98,0x40,
+0xfe,0x00,0x20,0x20,0x02,0xab,0x6f,0xe8,0x49,0xa4,0x67,0xe8,0x48,0xb3,0x20,0x60,
+0x00,0x00,0x20,0x40,0x02,0xb4,0x6f,0xe8,0x49,0x2e,0x67,0xe8,0x48,0xb7,0x20,0x60,
+0x00,0x00,0x20,0x40,0x02,0x49,0x20,0x20,0x51,0xd6,0x20,0x40,0x56,0x4b,0x24,0x7a,
+0x00,0x00,0x20,0x40,0x56,0x92,0x18,0x00,0x24,0x00,0x20,0x40,0x56,0x9d,0x1f,0xe2,
+0x0a,0x00,0x6f,0xe4,0x02,0x62,0x1f,0xe2,0x26,0x00,0x6f,0xe4,0x02,0x60,0x98,0x00,
+0x0c,0x00,0xef,0xe2,0x00,0x06,0xc0,0x01,0x86,0x63,0xc0,0x02,0x06,0x6c,0xc0,0x02,
+0xd1,0xd5,0xc0,0x03,0x02,0xdf,0x20,0x40,0x54,0xe3,0x1a,0x60,0xa7,0xfc,0x24,0x22,
+0x82,0xc7,0x1a,0x42,0x04,0x00,0x20,0x40,0x54,0xb8,0x20,0x20,0x51,0xd6,0x6f,0xe2,
+0x05,0x4e,0x67,0xe2,0x04,0xc5,0xc0,0x08,0x82,0xd6,0x20,0x20,0x61,0x95,0x20,0x40,
+0x61,0xd7,0x20,0x20,0x06,0x57,0x6f,0xe2,0x05,0x4e,0x67,0xe2,0x04,0xc5,0xc0,0x05,
+0x82,0xdc,0x20,0x20,0x61,0xa6,0xda,0x20,0x00,0x06,0x20,0x40,0x00,0xfd,0x20,0x20,
+0x61,0xdf,0xef,0xe2,0x00,0x06,0x1f,0xe2,0x0e,0x00,0xef,0xe4,0x00,0x06,0x1f,0xe2,
+0x22,0x00,0x1a,0x62,0x7e,0x00,0x9a,0x26,0x26,0x00,0xef,0xe4,0x00,0x06,0x1f,0xe2,
+0x22,0x00,0xef,0xe4,0x00,0x06,0x1f,0xe2,0x16,0x00,0x20,0x40,0x7c,0x83,0x58,0x00,
+0x00,0x48,0x1a,0x22,0x04,0x00,0x98,0x46,0x7c,0x00,0x20,0x22,0x86,0x9b,0x58,0x00,
+0x00,0x50,0x1a,0x22,0x04,0x00,0x98,0x46,0x7c,0x00,0x20,0x22,0x82,0xf3,0x20,0x20,
+0x55,0xc7,0x20,0x40,0x55,0xd4,0x70,0x48,0x90,0x64,0x20,0x60,0x00,0x00,0x6f,0xe4,
+0x41,0xdd,0x20,0x3a,0x4a,0x8b,0xd8,0x40,0x01,0x04,0x98,0x46,0x7e,0x00,0x20,0x22,
+0xeb,0xa8,0x20,0x20,0x6b,0xa1,0x20,0x60,0x00,0x00,0x58,0x00,0x0d,0x03,0x67,0xe4,
+0x49,0x72,0x58,0x00,0x0b,0x1e,0x67,0xe4,0x49,0x4a,0x20,0x20,0x05,0x4a,0x6f,0xe2,
+0x02,0x64,0xc0,0x24,0x83,0x05,0x20,0x20,0x51,0x63,0x6f,0xe4,0x02,0x60,0x1f,0xe2,
+0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0x80,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0x80,
+0x80,0x00,0xda,0x20,0x00,0x7f,0x20,0x40,0x56,0x1a,0x1f,0xe2,0x0a,0x00,0x58,0x00,
+0x00,0x04,0xe7,0xe4,0x00,0x05,0x6f,0xe4,0x48,0x91,0xe7,0xe4,0x00,0x05,0x58,0x00,
+0x02,0x01,0xe7,0xe8,0x00,0x05,0x70,0x48,0x90,0x02,0x20,0x20,0x51,0xd6,0x18,0x42,
+0x7e,0x00,0xc0,0x07,0x83,0x19,0x20,0x20,0x52,0x38,0x20,0x40,0x7c,0x83,0x19,0x62,
+0x7e,0x00,0x67,0xe4,0x48,0x91,0xd8,0x40,0x00,0x49,0x20,0x20,0x52,0x8b,0x58,0x00,
+0x00,0x49,0x98,0x46,0x7c,0x00,0x20,0x22,0x83,0x22,0x20,0x20,0x52,0xe9,0xd9,0x60,
+0x00,0x49,0x6f,0xe4,0x48,0x91,0x1f,0xe2,0x04,0x00,0x20,0x40,0x53,0x1d,0x70,0x48,
+0x93,0x01,0x20,0x60,0x00,0x00,0x58,0x00,0x00,0x50,0x98,0x46,0x7c,0x00,0x20,0x22,
+0x83,0x2c,0x20,0x20,0x53,0xb2,0x20,0x40,0x53,0xcc,0x70,0x48,0x90,0x64,0x20,0x60,
+0x00,0x00,0xef,0xe4,0x00,0x06,0x1f,0xf0,0xfe,0x00,0x1f,0xe6,0x7c,0x01,0x24,0x22,
+0xd1,0xd6,0xef,0xe4,0x00,0x06,0xc0,0x84,0x51,0xd6,0xef,0xe2,0x00,0x06,0xc0,0x83,
+0x51,0xd6,0xef,0xe2,0x00,0x06,0xc0,0x82,0x51,0xd6,0xef,0xe4,0x00,0x06,0x1f,0xf0,
+0xfe,0x00,0xc0,0x00,0x83,0x3e,0xc0,0x01,0x03,0x48,0x20,0x20,0x51,0xd6,0x18,0xc2,
+0x22,0x00,0x18,0xc0,0x8c,0x10,0xef,0xe8,0x00,0x06,0x68,0x48,0x49,0xa4,0x98,0x46,
+0x7c,0x00,0x24,0x22,0xd1,0xd6,0x1a,0x22,0x0c,0x00,0xef,0xec,0x00,0x06,0x67,0xec,
+0x49,0xa8,0x20,0x20,0x03,0x5e,0x6f,0xe2,0x48,0x9d,0xc0,0x82,0xd1,0xd6,0x20,0x40,
+0x01,0x07,0x70,0x48,0x9d,0x06,0x20,0x20,0x51,0xd6,0x58,0x00,0x00,0x00,0x67,0xec,
+0x49,0xa8,0x70,0x48,0x9d,0x05,0x70,0x49,0xa3,0x01,0xda,0x20,0x00,0x25,0x20,0x40,
+0x02,0x70,0x6f,0xee,0x48,0x9e,0xe7,0xee,0x00,0x05,0xd8,0xc0,0x49,0x9a,0xdf,0x20,
+0x00,0x0a,0x20,0x40,0x7c,0xcf,0x6f,0xec,0x40,0xa0,0x20,0x40,0x02,0xa4,0xd8,0xc0,
+0x49,0xa4,0xdf,0x20,0x00,0x0e,0x20,0x40,0x7c,0xcf,0x20,0x20,0x51,0xd6,0x70,0x49,
+0xa3,0x02,0x6f,0xe2,0x0b,0x0e,0xc0,0x01,0x03,0x69,0xc0,0x00,0x03,0x6e,0xda,0x20,
+0x00,0x25,0x20,0x40,0x02,0x70,0x58,0x00,0x00,0x04,0xe7,0xe2,0x00,0x05,0x6f,0xec,
+0x49,0xa8,0x20,0x40,0x02,0xa4,0x20,0x20,0x03,0x55,0xda,0x20,0x00,0x1f,0x20,0x40,
+0x02,0x70,0x58,0x00,0x00,0x02,0xe7,0xe2,0x00,0x05,0x20,0x20,0x03,0x55,0xda,0x20,
+0x00,0x25,0x20,0x40,0x02,0x70,0x58,0x00,0x00,0x04,0xe7,0xe2,0x00,0x05,0x6f,0xec,
+0x49,0xb8,0xe7,0xec,0x00,0x05,0x20,0x20,0x03,0x55,0x18,0xc0,0x8c,0x02,0xef,0xe4,
+0x00,0x06,0x1f,0xf0,0xa6,0x00,0xe8,0x44,0x00,0x06,0xef,0xe4,0x00,0x06,0xda,0x40,
+0xff,0x1f,0x9a,0x41,0x7e,0x00,0x7d,0x3a,0x00,0x31,0x18,0xc0,0x8c,0x01,0xef,0xe2,
+0x00,0x06,0x18,0xc0,0xa2,0x02,0xc0,0x00,0x83,0x84,0xc0,0x03,0x04,0x99,0xc0,0x08,
+0x85,0x59,0x20,0x20,0x51,0xd6,0x20,0x40,0x51,0xd6,0x68,0x48,0x49,0xa4,0x1a,0x20,
+0x8c,0x04,0xef,0xe8,0x00,0x06,0x98,0x46,0x7c,0x00,0x24,0x62,0x80,0x00,0xef,0xe4,
+0x00,0x06,0xc1,0x81,0x80,0x00,0xda,0x20,0x03,0xe1,0x20,0x40,0x04,0x44,0xda,0x20,
+0x00,0x02,0x20,0x20,0x04,0x01,0x6f,0xe2,0x49,0x19,0xc0,0x80,0x50,0x1c,0x68,0x42,
+0x0a,0x9e,0x60,0x42,0x49,0x18,0xef,0xe8,0x00,0x03,0x67,0xe8,0x49,0x2e,0xef,0xe4,
+0x00,0x03,0x67,0xe4,0x49,0x34,0x70,0x49,0x2d,0xc8,0x20,0x40,0x05,0x1b,0x6f,0xe2,
+0x0b,0x00,0xc0,0x03,0xd0,0x1f,0xef,0xe4,0x00,0x03,0x67,0xe4,0x49,0x1b,0x20,0x40,
+0x50,0x1f,0x20,0x20,0x04,0x41,0x6f,0xe2,0x49,0x19,0xc0,0x81,0xd0,0x1c,0x70,0x49,
+0x2d,0x19,0x20,0x40,0x04,0x5d,0x20,0x40,0x05,0x17,0x20,0x20,0x50,0x1f,0x6f,0xe2,
+0x49,0x19,0xc0,0x81,0xd0,0x1c,0x70,0x0b,0x01,0x00,0x6f,0xe4,0x49,0x16,0x67,0xe4,
+0x48,0x8e,0x6f,0xe2,0x49,0x22,0x24,0x7a,0x00,0x00,0x20,0x40,0x07,0xc1,0x20,0x7a,
+0x00,0x00,0x70,0x0b,0x01,0x01,0x6f,0xe2,0x0b,0x00,0x1f,0xe6,0x7c,0xec,0x24,0x21,
+0x50,0x1c,0x1f,0xe0,0x85,0xff,0x18,0x42,0x72,0x00,0x60,0x44,0x49,0x12,0x6f,0xe8,
+0x49,0x36,0x20,0x40,0x02,0xab,0x67,0xe8,0x03,0x0d,0xe0,0x42,0x00,0x05,0x20,0x40,
+0x67,0xda,0xda,0x20,0x03,0x0d,0x20,0x40,0x07,0x95,0x58,0x00,0x03,0x12,0x67,0xe4,
+0x49,0x14,0x20,0x40,0x05,0x0f,0x6f,0xe2,0x0b,0x00,0x1f,0xe0,0x85,0xff,0x20,0x40,
+0x04,0x60,0x20,0x20,0x50,0x1f,0x6f,0xe8,0x49,0x27,0x68,0x48,0x49,0x23,0x98,0x46,
+0x7c,0x00,0x20,0x61,0x00,0x00,0x60,0x48,0x49,0x27,0x6f,0xe2,0x49,0x22,0xc0,0x80,
+0x03,0xd8,0x6f,0xe4,0x49,0x16,0x67,0xe4,0x48,0x8e,0x20,0x40,0x07,0xbd,0x20,0x3a,
+0x03,0xe1,0xda,0x20,0x03,0x0d,0x20,0x40,0x07,0xac,0x68,0x48,0x03,0x0d,0xef,0xe2,
+0x00,0x06,0x98,0x40,0x84,0x00,0x6f,0xe8,0x49,0x27,0x98,0x46,0x7c,0x00,0x20,0x22,
+0x83,0xe1,0x20,0x20,0x03,0xcb,0x6f,0xe4,0x49,0x1f,0x1f,0xe2,0x22,0x00,0xe8,0x48,
+0x00,0x11,0xef,0xe2,0x00,0x06,0x98,0x40,0x84,0x00,0x6f,0xe8,0x49,0x27,0x98,0x46,
+0x7c,0x00,0x20,0x22,0x83,0xe3,0x20,0x20,0x03,0xcb,0x70,0x49,0x22,0x00,0x20,0x60,
+0x00,0x00,0x70,0x49,0x22,0x02,0x20,0x60,0x00,0x00,0xda,0x20,0x03,0xe7,0x20,0x20,
+0x04,0x44,0x20,0x40,0x03,0xec,0x20,0x40,0x04,0x03,0x20,0x40,0x04,0x0e,0x20,0x40,
+0x04,0x12,0x20,0x20,0x04,0x3b,0xda,0x60,0x49,0x2d,0xda,0x40,0x03,0xef,0x20,0x20,
+0x4d,0x04,0x6f,0xe2,0x49,0x19,0xc0,0x00,0x83,0xf4,0xc0,0x02,0x83,0xf6,0xc0,0x03,
+0x03,0xf6,0x20,0x60,0x00,0x00,0xda,0x20,0x00,0x00,0x20,0x20,0x03,0xf8,0xda,0x20,
+0x00,0x03,0x20,0x20,0x03,0xf8,0x20,0x40,0x05,0x4c,0x70,0x0a,0xff,0x32,0x58,0x00,
 0x00,0x02,0x20,0x40,0x50,0xa5,0x1a,0x22,0x7e,0x00,0xe7,0xe2,0x00,0x0a,0x6f,0xe2,
-0x49,0x17,0xe7,0xe2,0x00,0x0a,0x20,0x20,0x67,0xb9,0x70,0x0a,0xff,0x32,0x20,0x20,
-0x00,0xfe,0xda,0x60,0x49,0x2b,0xda,0x40,0x04,0x02,0x20,0x20,0x4d,0x04,0x70,0x49,
-0x2b,0x01,0x20,0x40,0x56,0x4e,0x24,0x7a,0x00,0x00,0x70,0x49,0x2b,0x00,0x6f,0xe2,
-0x49,0x18,0xc0,0x00,0x85,0x14,0xc0,0x02,0x85,0x0f,0x20,0x60,0x00,0x00,0xda,0x60,
-0x49,0x2a,0xda,0x40,0x04,0x0d,0x20,0x20,0x4d,0x04,0x20,0x20,0x00,0xed,0xda,0x60,
-0x49,0x20,0xda,0x40,0x04,0x11,0x20,0x20,0x4d,0x04,0x6f,0xe4,0x49,0x15,0x67,0xe4,
-0x48,0x8f,0x70,0x49,0x20,0x01,0x6f,0xe2,0x49,0x21,0xc0,0x00,0x84,0x1b,0x20,0x40,
-0x07,0xa8,0x20,0x3a,0x03,0xdc,0x70,0x49,0x21,0x01,0xda,0x20,0x03,0x0d,0x20,0x40,
-0x04,0x2e,0x6f,0xe4,0x49,0x1e,0x1f,0xe2,0x22,0x00,0x6f,0xe8,0x49,0x35,0x67,0xe8,
-0x0a,0x96,0xef,0xe8,0x00,0x11,0x68,0x48,0x49,0x26,0x98,0x46,0x7c,0x00,0x24,0x21,
-0x03,0xdc,0x20,0x40,0x02,0xa8,0x67,0xe8,0x49,0x35,0x1a,0x20,0x8c,0x04,0xef,0xe2,
-0x00,0x06,0x67,0xe4,0x49,0x11,0x18,0xc2,0x7e,0x00,0x67,0xe4,0x49,0x13,0x20,0x40,
-0x05,0x07,0x6f,0xe8,0x0a,0x96,0x67,0xe8,0x49,0x35,0x20,0x60,0x00,0x00,0x20,0x40,
-0x07,0x97,0x68,0x44,0x48,0x8f,0x18,0x40,0xa4,0x03,0xef,0xe2,0x00,0x12,0x24,0x3a,
-0x04,0x34,0x18,0x40,0x84,0xf0,0x18,0x40,0x84,0x05,0x60,0x44,0x49,0x1e,0x20,0x60,
-0x00,0x00,0xda,0x60,0x49,0x1c,0xda,0x40,0x04,0x3a,0x20,0x20,0x4d,0x0b,0x20,0x40,
-0x04,0x5b,0x20,0x40,0x05,0x05,0x20,0x40,0x04,0x59,0x6f,0xe4,0x49,0x1a,0x67,0xe4,
-0x49,0x1c,0x20,0x60,0x00,0x00,0x1a,0x22,0x7e,0x00,0x67,0xe4,0x0a,0xaa,0xd8,0x40,
-0x00,0x00,0x20,0x40,0x04,0x47,0x6f,0xe4,0x0a,0xaa,0x1f,0xe2,0x22,0x00,0xd8,0x40,
-0x00,0x01,0x20,0x40,0x04,0x4c,0x60,0x42,0x49,0x17,0x1a,0x22,0x7e,0x00,0x20,0x40,
-0x7d,0x77,0x20,0x20,0x04,0x52,0x18,0x4f,0xfe,0x28,0xd8,0xc0,0x49,0x49,0x98,0xc0,
-0x8c,0x00,0xd8,0xa0,0x49,0x15,0xdf,0x20,0x00,0x28,0x20,0x20,0x7c,0xcf,0x6f,0xe2,
-0x49,0x17,0x1f,0xef,0xfe,0x28,0xd8,0xa0,0x49,0x49,0x98,0xa0,0x8a,0x00,0xd8,0xc0,
-0x49,0x15,0xdf,0x20,0x00,0x28,0x20,0x20,0x7c,0xcf,0xd8,0x40,0x00,0x01,0x20,0x20,
-0x04,0x5c,0xd8,0x5f,0xff,0xff,0x6f,0xe8,0x49,0x35,0x20,0x40,0x02,0xae,0x67,0xe8,
-0x49,0x35,0x20,0x60,0x00,0x00,0x6f,0xe2,0x49,0x18,0xc0,0x81,0x82,0x0b,0x70,0x49,
-0xf2,0x19,0x6f,0xe8,0x49,0x35,0x20,0x40,0x02,0xa8,0x67,0xe8,0x49,0xed,0x68,0x44,
-0x49,0xf4,0x60,0x44,0x49,0x11,0x58,0x00,0x49,0xf8,0x67,0xe4,0x49,0x13,0x20,0x40,
-0x05,0x08,0x70,0x49,0xf1,0x05,0x68,0x44,0x49,0xf4,0x20,0x20,0x04,0x5c,0x6f,0xe2,
-0x49,0xf1,0x20,0x7a,0x00,0x00,0x68,0x42,0x49,0xf3,0xda,0x20,0x04,0x73,0x20,0x20,
-0x04,0x47,0x6f,0xe8,0x49,0xed,0x68,0x44,0x49,0xf4,0x98,0x40,0x84,0x00,0x68,0x48,
-0x49,0x22,0x98,0x46,0x7c,0x00,0x20,0x22,0x84,0x7a,0x20,0x61,0x00,0x00,0xda,0x20,
-0x00,0x03,0x20,0x20,0x02,0x0c,0x20,0x40,0x04,0x7e,0x20,0x20,0x04,0x8c,0xda,0x60,
-0x49,0xf1,0xda,0x40,0x04,0x81,0x20,0x20,0x4d,0x04,0x68,0x42,0x49,0xf3,0xda,0x20,
-0x04,0x84,0x20,0x20,0x04,0x47,0x6f,0xe2,0x49,0x18,0xc0,0x81,0x82,0x0b,0x6f,0xe8,
-0x49,0x35,0x67,0xe8,0x0a,0x96,0x20,0x40,0x04,0x66,0x6f,0xe8,0x0a,0x96,0x67,0xe8,
-0x49,0x35,0x20,0x60,0x00,0x00,0xda,0x60,0x49,0xf2,0xda,0x40,0x04,0x8f,0x20,0x20,
-0x4d,0x04,0xda,0x20,0x00,0x02,0x20,0x20,0x02,0x0c,0xda,0x40,0x00,0x18,0x20,0x40,
-0x02,0x50,0x24,0x22,0xd1,0xd6,0x1a,0x22,0x7e,0x00,0x67,0xe4,0x0a,0x96,0xda,0x20,
-0x04,0x98,0x20,0x20,0x04,0x40,0x6f,0xe4,0x0a,0x96,0x1f,0xe2,0x22,0x00,0x20,0x40,
-0x04,0xf6,0x24,0x34,0x51,0xd6,0x20,0x40,0x04,0x3d,0x20,0x40,0x04,0xae,0x20,0x40,
-0x04,0xb3,0x20,0x34,0x05,0x05,0x20,0x40,0x04,0xbb,0x1a,0x20,0x8c,0x15,0xe8,0x42,
-0x00,0x06,0x6f,0xe2,0x49,0x18,0xc0,0x00,0x84,0xd3,0xc5,0x16,0x84,0xda,0x28,0x4f,
-0xfe,0x00,0x20,0x20,0x84,0xe2,0x28,0x4f,0xfe,0x02,0x20,0x20,0x84,0xf3,0xc0,0x02,
-0x84,0xef,0x18,0x42,0x7e,0x00,0xc0,0x08,0x51,0xd6,0x20,0x20,0x05,0x05,0x1a,0x20,
-0x8c,0x10,0xef,0xe8,0x00,0x06,0x20,0x40,0x02,0xa8,0x67,0xe8,0x49,0x22,0x20,0x60,
-0x00,0x00,0x20,0x40,0x7d,0xc1,0x6f,0xe8,0x49,0x39,0x20,0x7a,0x00,0x00,0x1a,0x20,
+0x49,0x18,0xe7,0xe2,0x00,0x0a,0x20,0x20,0x67,0xb9,0x70,0x0a,0xff,0x32,0x20,0x20,
+0x00,0xfe,0xda,0x60,0x49,0x2c,0xda,0x40,0x04,0x06,0x20,0x20,0x4d,0x04,0x70,0x49,
+0x2c,0x01,0x20,0x40,0x56,0x4e,0x24,0x7a,0x00,0x00,0x70,0x49,0x2c,0x00,0x6f,0xe2,
+0x49,0x19,0xc0,0x00,0x85,0x1c,0xc0,0x02,0x85,0x17,0x20,0x60,0x00,0x00,0xda,0x60,
+0x49,0x2b,0xda,0x40,0x04,0x11,0x20,0x20,0x4d,0x04,0x20,0x20,0x00,0xed,0xda,0x60,
+0x49,0x21,0xda,0x40,0x04,0x15,0x20,0x20,0x4d,0x04,0x6f,0xe4,0x49,0x16,0x67,0xe4,
+0x48,0x8e,0x70,0x49,0x21,0x01,0x6f,0xe2,0x49,0x22,0xc0,0x00,0x84,0x1f,0x20,0x40,
+0x07,0xbd,0x20,0x3a,0x03,0xe1,0x70,0x49,0x22,0x01,0xda,0x20,0x03,0x0d,0x20,0x40,
+0x04,0x32,0x6f,0xe4,0x49,0x1f,0x1f,0xe2,0x22,0x00,0x6f,0xe8,0x49,0x36,0x67,0xe8,
+0x0a,0x96,0xef,0xe8,0x00,0x11,0x68,0x48,0x49,0x27,0x98,0x46,0x7c,0x00,0x24,0x21,
+0x03,0xe1,0x20,0x40,0x02,0xab,0x67,0xe8,0x49,0x36,0x1a,0x20,0x8c,0x04,0xef,0xe2,
+0x00,0x06,0x67,0xe4,0x49,0x12,0x18,0xc2,0x7e,0x00,0x67,0xe4,0x49,0x14,0x20,0x40,
+0x05,0x0f,0x6f,0xe8,0x0a,0x96,0x67,0xe8,0x49,0x36,0x20,0x60,0x00,0x00,0x20,0x40,
+0x07,0xac,0x68,0x44,0x48,0x8e,0x18,0x40,0xa4,0x03,0xef,0xe2,0x00,0x12,0x24,0x3a,
+0x04,0x38,0x18,0x40,0x84,0xf0,0x18,0x40,0x84,0x05,0x60,0x44,0x49,0x1f,0x20,0x60,
+0x00,0x00,0xda,0x60,0x49,0x1d,0xda,0x40,0x04,0x3e,0x20,0x20,0x4d,0x0b,0x20,0x40,
+0x04,0x5f,0x20,0x40,0x05,0x0d,0x20,0x40,0x04,0x5d,0x6f,0xe4,0x49,0x1b,0x67,0xe4,
+0x49,0x1d,0x20,0x60,0x00,0x00,0x1a,0x22,0x7e,0x00,0x67,0xe4,0x0a,0xaa,0xd8,0x40,
+0x00,0x00,0x20,0x40,0x04,0x4b,0x6f,0xe4,0x0a,0xaa,0x1f,0xe2,0x22,0x00,0xd8,0x40,
+0x00,0x01,0x20,0x40,0x04,0x50,0x60,0x42,0x49,0x18,0x1a,0x22,0x7e,0x00,0x20,0x40,
+0x7d,0x77,0x20,0x20,0x04,0x56,0x18,0x4f,0xfe,0x28,0xd8,0xc0,0x49,0x4a,0x98,0xc0,
+0x8c,0x00,0xd8,0xa0,0x49,0x16,0xdf,0x20,0x00,0x28,0x20,0x20,0x7c,0xcf,0x6f,0xe2,
+0x49,0x18,0x1f,0xef,0xfe,0x28,0xd8,0xa0,0x49,0x4a,0x98,0xa0,0x8a,0x00,0xd8,0xc0,
+0x49,0x16,0xdf,0x20,0x00,0x28,0x20,0x20,0x7c,0xcf,0xd8,0x40,0x00,0x01,0x20,0x20,
+0x04,0x60,0xd8,0x5f,0xff,0xff,0x6f,0xe8,0x49,0x36,0x20,0x40,0x02,0xb1,0x67,0xe8,
+0x49,0x36,0x20,0x60,0x00,0x00,0x6f,0xe2,0x49,0x19,0xc0,0x81,0x82,0x0e,0x70,0x49,
+0xf4,0x19,0x6f,0xe8,0x49,0x36,0x20,0x40,0x02,0xab,0x67,0xe8,0x49,0xef,0x6f,0xe8,
+0x49,0xef,0x20,0x40,0x02,0xab,0x67,0xe8,0x49,0x36,0x68,0x44,0x49,0xf6,0x60,0x44,
+0x49,0x12,0x58,0x00,0x49,0xfa,0x67,0xe4,0x49,0x14,0x20,0x40,0x56,0x4e,0x20,0x5a,
+0x05,0x10,0x70,0x49,0xf3,0x05,0x68,0x44,0x49,0xf6,0x20,0x20,0x04,0x60,0x6f,0xe2,
+0x49,0xf3,0x20,0x7a,0x00,0x00,0x68,0x42,0x49,0xf5,0xda,0x20,0x04,0x7b,0x20,0x20,
+0x04,0x4b,0x6f,0xe8,0x49,0xef,0x68,0x44,0x49,0xf6,0x98,0x40,0x84,0x00,0x6f,0xe8,
+0x49,0x23,0x98,0x46,0x7c,0x00,0x20,0x22,0x84,0x82,0x24,0x61,0x00,0x00,0xda,0x20,
+0x00,0x03,0x20,0x20,0x02,0x0f,0x20,0x40,0x04,0x86,0x20,0x20,0x04,0x94,0xda,0x60,
+0x49,0xf3,0xda,0x40,0x04,0x89,0x20,0x20,0x4d,0x04,0x68,0x42,0x49,0xf5,0xda,0x20,
+0x04,0x8c,0x20,0x20,0x04,0x4b,0x6f,0xe2,0x49,0x19,0xc0,0x81,0x82,0x0e,0x6f,0xe8,
+0x49,0x36,0x67,0xe8,0x0a,0x96,0x20,0x40,0x04,0x6a,0x6f,0xe8,0x0a,0x96,0x67,0xe8,
+0x49,0x36,0x20,0x60,0x00,0x00,0xda,0x60,0x49,0xf4,0xda,0x40,0x04,0x97,0x20,0x20,
+0x4d,0x04,0xda,0x20,0x00,0x02,0x20,0x20,0x02,0x0f,0xda,0x40,0x00,0x18,0x20,0x40,
+0x02,0x53,0x24,0x22,0xd1,0xd6,0x1a,0x22,0x7e,0x00,0x67,0xe4,0x0a,0x96,0xda,0x20,
+0x04,0xa0,0x20,0x20,0x04,0x44,0x6f,0xe4,0x0a,0x96,0x1f,0xe2,0x22,0x00,0x20,0x40,
+0x04,0xfe,0x24,0x34,0x51,0xd6,0x20,0x40,0x04,0x41,0x20,0x40,0x04,0xb6,0x20,0x40,
+0x04,0xbb,0x20,0x34,0x05,0x0d,0x20,0x40,0x04,0xc3,0x1a,0x20,0x8c,0x15,0xe8,0x42,
+0x00,0x06,0x6f,0xe2,0x49,0x19,0xc0,0x00,0x84,0xdb,0xc5,0x16,0x84,0xe2,0x28,0x4f,
+0xfe,0x00,0x20,0x20,0x84,0xea,0x28,0x4f,0xfe,0x02,0x20,0x20,0x84,0xfb,0xc0,0x02,
+0x84,0xf7,0x18,0x42,0x7e,0x00,0xc0,0x08,0x51,0xd6,0x20,0x20,0x05,0x0d,0x1a,0x20,
+0x8c,0x10,0xef,0xe8,0x00,0x06,0x20,0x40,0x02,0xab,0x67,0xe8,0x49,0x23,0x20,0x60,
+0x00,0x00,0x20,0x40,0x7d,0xc1,0x6f,0xe8,0x49,0x3a,0x20,0x7a,0x00,0x00,0x1a,0x20,
 0x8c,0x0c,0xe8,0x48,0x00,0x06,0x98,0x46,0x7c,0x00,0x20,0x62,0x80,0x00,0x20,0x20,
-0x7d,0xbf,0x20,0x40,0x04,0xc4,0x18,0x42,0x26,0x00,0x7d,0x22,0x80,0x2d,0x20,0x62,
-0x80,0x00,0x1a,0x20,0x8c,0x0c,0xef,0xe8,0x00,0x06,0x20,0x40,0x02,0xae,0x67,0xe8,
-0x49,0x39,0x20,0x60,0x00,0x00,0x79,0x3f,0x80,0x2e,0x1a,0x20,0x8c,0x14,0xef,0xe2,
+0x7d,0xbf,0x20,0x40,0x04,0xcc,0x18,0x42,0x26,0x00,0x7d,0x22,0x80,0x2d,0x20,0x62,
+0x80,0x00,0x1a,0x20,0x8c,0x0c,0xef,0xe8,0x00,0x06,0x20,0x40,0x02,0xb1,0x67,0xe8,
+0x49,0x3a,0x20,0x60,0x00,0x00,0x79,0x3f,0x80,0x2e,0x1a,0x20,0x8c,0x14,0xef,0xe2,
 0x00,0x06,0x1f,0xeb,0x04,0x00,0x1a,0x20,0x8d,0xf6,0xef,0xe4,0x00,0x06,0x1f,0xf0,
 0xfe,0x00,0x98,0x46,0x7e,0x00,0x1f,0xe0,0x85,0xec,0x1a,0x20,0x8c,0x15,0xef,0xe2,
 0x00,0x06,0xc4,0x00,0x80,0x00,0x18,0x40,0x84,0x01,0x79,0x20,0x00,0x2e,0x20,0x60,
-0x00,0x00,0x18,0x42,0x7e,0x00,0xc0,0x89,0x51,0xd6,0x20,0x40,0x04,0x59,0x20,0x40,
-0x05,0x05,0x70,0x49,0x18,0x03,0x70,0x49,0x2c,0x00,0x20,0x20,0x00,0xe7,0x20,0x40,
-0x04,0xdc,0x20,0x20,0x05,0x05,0xc6,0x17,0x00,0x00,0x1a,0x62,0x7e,0x00,0x67,0xe4,
-0x49,0x11,0x1a,0x20,0xfe,0x1c,0x67,0xe4,0x49,0x13,0x20,0x20,0x02,0x12,0x6f,0xe8,
-0x49,0x39,0xd8,0x40,0x00,0x01,0x20,0x40,0x02,0xae,0x67,0xe8,0x49,0x39,0x6f,0xe2,
-0x49,0x18,0xc0,0x02,0x84,0xec,0xc0,0x03,0x04,0xec,0x70,0x49,0x18,0x04,0x70,0x49,
-0x2a,0x01,0x20,0x20,0x05,0x0a,0x70,0x49,0x18,0x06,0x70,0x49,0x2a,0x01,0x20,0x20,
-0x05,0x05,0x18,0x42,0x7e,0x00,0xc0,0x88,0x51,0xd6,0x70,0x49,0x18,0x06,0x20,0x20,
-0x51,0xd6,0x70,0x49,0x2a,0x01,0x70,0x49,0x18,0x07,0x20,0x20,0x51,0xd6,0x20,0x40,
-0x7d,0xc1,0x68,0x48,0x49,0x2d,0xef,0xe8,0x00,0x11,0x98,0x46,0x7c,0x00,0x24,0x62,
-0x80,0x00,0x68,0x44,0x49,0x33,0x1a,0x20,0x8c,0x08,0xef,0xe4,0x00,0x06,0x98,0x46,
-0x7c,0x00,0x24,0x62,0x80,0x00,0xef,0xe4,0x00,0x06,0x68,0x44,0x49,0x31,0x98,0x46,
-0x7c,0x00,0x24,0x62,0x80,0x00,0x20,0x20,0x7d,0xbf,0x70,0x49,0x3e,0x10,0x20,0x20,
-0x05,0x30,0x70,0x49,0x20,0x05,0x70,0x49,0x3e,0x18,0x20,0x20,0x05,0x30,0x70,0x49,
-0x3e,0x11,0x20,0x40,0x05,0x30,0x20,0x20,0x04,0x59,0x70,0x49,0x3e,0x02,0x20,0x20,
-0x05,0x30,0x70,0x49,0x2b,0x05,0x70,0x49,0x18,0x05,0x20,0x40,0x04,0x5b,0x20,0x20,
-0x05,0x0a,0x20,0x40,0x05,0x21,0x70,0x49,0x2b,0x05,0x58,0x00,0x00,0x04,0x67,0xe4,
-0x49,0x11,0x58,0x00,0x04,0x02,0x67,0xe4,0x49,0x45,0x58,0x00,0xb4,0x05,0xe7,0xe4,
-0x00,0x05,0x58,0x00,0x49,0x45,0x67,0xe4,0x49,0x13,0x70,0x49,0x3d,0x60,0x20,0x40,
-0x05,0x0d,0x70,0x49,0x3d,0x50,0x20,0x60,0x00,0x00,0x70,0x49,0x18,0x01,0x18,0x0a,
+0x00,0x00,0x18,0x42,0x7e,0x00,0xc0,0x89,0x51,0xd6,0x20,0x40,0x04,0x5d,0x20,0x40,
+0x05,0x0d,0x70,0x49,0x19,0x03,0x70,0x49,0x2d,0x00,0x20,0x20,0x00,0xe7,0x20,0x40,
+0x04,0xe4,0x20,0x20,0x05,0x0d,0xc6,0x17,0x00,0x00,0x1a,0x62,0x7e,0x00,0x67,0xe4,
+0x49,0x12,0x1a,0x20,0xfe,0x1c,0x67,0xe4,0x49,0x14,0x20,0x20,0x02,0x15,0x6f,0xe8,
+0x49,0x3a,0xd8,0x40,0x00,0x01,0x20,0x40,0x02,0xb1,0x67,0xe8,0x49,0x3a,0x6f,0xe2,
+0x49,0x19,0xc0,0x02,0x84,0xf4,0xc0,0x03,0x04,0xf4,0x70,0x49,0x19,0x04,0x70,0x49,
+0x2b,0x01,0x20,0x20,0x05,0x12,0x70,0x49,0x19,0x06,0x70,0x49,0x2b,0x01,0x20,0x20,
+0x05,0x0d,0x18,0x42,0x7e,0x00,0xc0,0x88,0x51,0xd6,0x70,0x49,0x19,0x06,0x20,0x20,
+0x51,0xd6,0x70,0x49,0x2b,0x01,0x70,0x49,0x19,0x07,0x20,0x20,0x51,0xd6,0x20,0x40,
+0x7d,0xc1,0x68,0x48,0x49,0x2e,0xef,0xe8,0x00,0x11,0x98,0x46,0x7c,0x00,0x24,0x62,
+0x80,0x00,0x68,0x44,0x49,0x34,0x1a,0x20,0x8c,0x08,0xef,0xe4,0x00,0x06,0x98,0x46,
+0x7c,0x00,0x24,0x62,0x80,0x00,0xef,0xe4,0x00,0x06,0x68,0x44,0x49,0x32,0x98,0x46,
+0x7c,0x00,0x24,0x62,0x80,0x00,0x20,0x20,0x7d,0xbf,0x70,0x49,0x3f,0x10,0x20,0x20,
+0x05,0x38,0x70,0x49,0x21,0x05,0x70,0x49,0x3f,0x18,0x20,0x20,0x05,0x38,0x70,0x49,
+0x3f,0x11,0x20,0x40,0x05,0x38,0x20,0x20,0x04,0x5d,0x70,0x49,0x3f,0x02,0x20,0x20,
+0x05,0x38,0x70,0x49,0x2c,0x05,0x70,0x49,0x19,0x05,0x20,0x40,0x04,0x5f,0x20,0x20,
+0x05,0x12,0x20,0x40,0x05,0x29,0x70,0x49,0x2c,0x05,0x58,0x00,0x00,0x04,0x67,0xe4,
+0x49,0x12,0x58,0x00,0x04,0x02,0x67,0xe4,0x49,0x46,0x58,0x00,0xb4,0x05,0xe7,0xe4,
+0x00,0x05,0x58,0x00,0x49,0x46,0x67,0xe4,0x49,0x14,0x70,0x49,0x3e,0x60,0x20,0x40,
+0x05,0x15,0x70,0x49,0x3e,0x50,0x20,0x60,0x00,0x00,0x70,0x49,0x19,0x01,0x18,0x0a,
 0x7e,0x00,0x1f,0xf0,0x84,0x00,0xdf,0xe0,0x13,0x88,0x98,0x46,0x7c,0x00,0x20,0x21,
-0x05,0x22,0x18,0x50,0xfe,0x00,0x67,0xe4,0x49,0x31,0xd8,0xa0,0x49,0x35,0x20,0x40,
-0x05,0x91,0x20,0x40,0x05,0x91,0x58,0x00,0x00,0x00,0x67,0xe8,0x49,0x39,0x67,0xf0,
-0x49,0x22,0x20,0x60,0x00,0x00,0x20,0x40,0x56,0x4b,0x24,0x3a,0x05,0x3f,0x20,0x40,
-0x02,0xb4,0x68,0x44,0x49,0x11,0x18,0x40,0x84,0x14,0x20,0x40,0x02,0x9a,0xd8,0xc0,
-0x49,0x31,0xdf,0x20,0x00,0x14,0x20,0x40,0x7c,0xcf,0x6f,0xe4,0x49,0x11,0x1f,0xe2,
-0x72,0x00,0x6f,0xe4,0x49,0x13,0x1f,0xe2,0x0c,0x00,0x20,0x40,0x7c,0xcf,0x20,0x40,
-0x02,0x44,0x58,0x00,0x00,0x00,0x67,0xe4,0x49,0x11,0x20,0x20,0x51,0xd6,0xda,0x20,
-0x05,0x44,0x20,0x20,0x04,0x40,0x68,0x44,0x49,0x15,0x58,0x00,0x02,0xf0,0xe7,0xea,
-0x00,0x02,0xdf,0x20,0x00,0x25,0xd8,0xa0,0x49,0x18,0x20,0x20,0x7c,0xaf,0xe8,0x42,
+0x05,0x2a,0x18,0x50,0xfe,0x00,0x67,0xe4,0x49,0x32,0xd8,0xa0,0x49,0x36,0x20,0x40,
+0x05,0x9a,0x20,0x40,0x05,0x9a,0x58,0x00,0x00,0x00,0x67,0xe8,0x49,0x3a,0x67,0xf0,
+0x49,0x23,0x20,0x60,0x00,0x00,0x20,0x40,0x56,0x4b,0x24,0x3a,0x05,0x47,0x20,0x40,
+0x02,0xb7,0x68,0x44,0x49,0x12,0x18,0x40,0x84,0x14,0x20,0x40,0x02,0x9d,0xd8,0xc0,
+0x49,0x32,0xdf,0x20,0x00,0x14,0x20,0x40,0x7c,0xcf,0x6f,0xe4,0x49,0x12,0x1f,0xe2,
+0x72,0x00,0x6f,0xe4,0x49,0x14,0x1f,0xe2,0x0c,0x00,0x20,0x40,0x7c,0xcf,0x20,0x40,
+0x02,0x47,0x58,0x00,0x00,0x00,0x67,0xe4,0x49,0x12,0x20,0x20,0x51,0xd6,0xda,0x20,
+0x05,0x4c,0x20,0x20,0x04,0x44,0x68,0x44,0x49,0x16,0x58,0x00,0x02,0xf0,0xe7,0xea,
+0x00,0x02,0xdf,0x20,0x00,0x25,0xd8,0xa0,0x49,0x19,0x20,0x20,0x7c,0xaf,0xe8,0x42,
 0x00,0x03,0x6f,0xe4,0x46,0x52,0xc3,0x06,0xd0,0x1c,0x60,0x42,0x0a,0x9e,0x18,0x46,
-0x7c,0x01,0x24,0x21,0x50,0x1c,0x20,0x20,0x04,0x47,0x20,0x40,0x51,0xd6,0x6f,0xe4,
-0x49,0xb5,0x98,0x46,0x7c,0x00,0x20,0x22,0x85,0x60,0x1a,0x20,0x8c,0x09,0xef,0xe2,
-0x00,0x06,0xc0,0x1a,0x85,0xff,0xc0,0x21,0x85,0x9b,0xef,0xe4,0x00,0x06,0x1f,0xe2,
-0x24,0x00,0x6f,0xe4,0x49,0xb3,0x9a,0x46,0x7c,0x00,0x24,0x62,0x80,0x00,0x28,0x0f,
-0xfe,0x31,0x24,0x40,0x85,0x65,0x1a,0x60,0xff,0xec,0x67,0xe4,0x49,0x11,0x1a,0x20,
-0xfe,0x08,0x67,0xe4,0x49,0x13,0x20,0x20,0x02,0x10,0x60,0x44,0x49,0xb5,0x1a,0x60,
-0xa7,0xf8,0x70,0x0a,0xff,0x38,0x58,0x00,0x00,0x0c,0x20,0x40,0x50,0xa5,0x1a,0x22,
-0x0c,0x00,0x1a,0x20,0xa2,0x08,0xdf,0x20,0x00,0x0c,0x20,0x40,0x67,0xc1,0x20,0x20,
-0x67,0xb9,0x20,0x40,0x02,0xb1,0xef,0xf0,0x00,0x03,0x67,0xf0,0x48,0xb6,0x6f,0xe4,
-0x48,0xba,0x67,0xe4,0x49,0xb3,0x6f,0xe2,0x0b,0x00,0x1f,0xf0,0x84,0x00,0x60,0x44,
-0x48,0xbe,0x1f,0xe2,0x04,0x00,0x20,0x40,0x02,0x93,0x6f,0xe2,0x0b,0x00,0x1f,0xe0,
-0xf3,0xf8,0x20,0x40,0x67,0xda,0x20,0x40,0x02,0x46,0x20,0x20,0x50,0x1f,0x20,0x40,
-0x02,0xb1,0x6f,0xf0,0x49,0xf8,0x67,0xf0,0x48,0xb6,0x6f,0xe4,0x48,0xba,0x67,0xe4,
-0x49,0xb3,0x6f,0xe4,0x49,0xf4,0x1f,0xf0,0x84,0x00,0x60,0x44,0x48,0xbe,0x1f,0xe2,
-0x04,0x00,0x20,0x40,0x02,0x93,0x6f,0xe4,0x49,0xf4,0x1f,0xe0,0xf3,0xf8,0xd8,0xc0,
-0x4a,0x00,0x20,0x40,0x7c,0xcf,0x20,0x40,0x02,0x46,0xda,0x20,0x00,0x04,0x20,0x20,
-0x02,0x0c,0x18,0x0a,0x7e,0x00,0x67,0xe4,0x48,0xc6,0x18,0x0a,0x7e,0x00,0xe7,0xe4,
-0x00,0x05,0x20,0x60,0x00,0x00,0x70,0x48,0xaf,0x11,0x70,0x48,0x9c,0x01,0x58,0x00,
-0x06,0x40,0x20,0x40,0x02,0x2a,0x70,0x0f,0xb0,0x01,0xd8,0x40,0x00,0x43,0x20,0x20,
-0x05,0xd6,0x58,0x00,0x01,0x02,0x9a,0x20,0x8c,0x00,0xef,0xe2,0x00,0x06,0xc0,0x01,
-0x05,0xa1,0xc0,0x02,0x85,0xb3,0x20,0x20,0x51,0xd6,0x6f,0xe2,0x48,0x9c,0xc0,0x80,
-0xd1,0xd6,0x70,0x48,0x9c,0x02,0x1a,0x20,0x8c,0x20,0xef,0xe8,0x00,0x06,0x67,0xe8,
-0x49,0xa3,0x67,0xe8,0x0f,0xee,0xef,0xe8,0x00,0x06,0x67,0xe8,0x49,0xad,0x67,0xe8,
-0x0f,0xf4,0x20,0x40,0x01,0x03,0x20,0x20,0x51,0xd6,0x58,0x00,0x06,0x40,0x20,0x40,
-0x02,0x2a,0x70,0x48,0x9c,0x03,0x70,0x0f,0xb0,0x03,0xd8,0x40,0x00,0x4f,0x20,0x20,
-0x05,0xd6,0x6f,0xe2,0x48,0x9c,0xc0,0x81,0xd1,0xd6,0x20,0x40,0x01,0x05,0x70,0x48,
-0x9c,0x04,0x20,0x20,0x51,0xd6,0x6f,0xe2,0x48,0x9c,0xc0,0x00,0x85,0xbf,0xc0,0x01,
-0x05,0xad,0xc0,0x01,0x85,0xc2,0xc0,0x02,0x05,0xd2,0xc0,0x03,0x05,0xd4,0x20,0x60,
-0x00,0x00,0x20,0x40,0x05,0xc5,0x24,0x74,0x00,0x00,0x20,0x20,0x05,0x94,0x20,0x40,
-0x05,0xc5,0x24,0x74,0x00,0x00,0x20,0x20,0x05,0xad,0x20,0x40,0x7d,0xc1,0x20,0x40,
-0x02,0x28,0x24,0x7a,0x00,0x00,0x6f,0xe4,0x48,0xca,0x1f,0xf0,0xfe,0x00,0x1f,0xe0,
-0xfe,0x01,0x1f,0xf0,0xfe,0x00,0x67,0xe4,0x48,0xca,0x58,0x00,0x06,0x40,0x20,0x40,
-0x02,0x2a,0x20,0x40,0x56,0x4e,0x24,0x7a,0x00,0x00,0x20,0x20,0x7d,0xbf,0x70,0x48,
-0x9b,0x00,0x20,0x20,0x03,0x4a,0x70,0x48,0x9c,0x09,0x20,0x60,0x00,0x00,0x60,0x42,
-0x0f,0xf9,0x18,0x40,0x84,0xf4,0x20,0x40,0x05,0xef,0x70,0x48,0xa7,0x10,0x18,0x40,
-0xa2,0x1d,0x20,0x40,0x02,0x7a,0xdf,0x20,0x00,0x31,0x18,0xa0,0xa2,0x15,0xd8,0xc0,
-0x48,0x9d,0x20,0x40,0x7c,0xcf,0xdf,0x20,0x00,0x02,0x20,0x40,0x7c,0xa1,0x6f,0xec,
-0x40,0xa0,0x20,0x40,0x02,0xa1,0xdf,0x20,0x00,0x19,0x20,0x40,0x7c,0xa1,0xe7,0xe4,
-0x00,0x05,0x6f,0xe2,0x0f,0xf9,0x98,0x00,0x72,0x00,0xd8,0xc0,0x0f,0xaa,0x20,0x40,
-0x7c,0xcf,0x18,0xa0,0x8b,0xff,0x58,0x00,0x00,0xff,0xe7,0xe2,0x00,0x05,0x20,0x20,
-0x02,0xb8,0x58,0x00,0x00,0x00,0x67,0xe8,0x48,0xb2,0x5f,0xff,0xff,0xff,0xe7,0xe8,
-0x00,0x05,0x58,0x00,0x00,0x44,0x1f,0xf0,0xfe,0x00,0xe7,0xe4,0x00,0x05,0x58,0x00,
-0x00,0x43,0x1f,0xf0,0xfe,0x00,0xe7,0xe4,0x00,0x05,0x20,0x60,0x00,0x00,0xda,0x60,
-0x48,0x9b,0xda,0x40,0x05,0xfd,0x20,0x20,0x4d,0x04,0x20,0x40,0x00,0xfb,0x20,0x20,
-0x4d,0x64,0x20,0x40,0x51,0xd6,0x1a,0x20,0x8c,0x16,0xef,0xe4,0x00,0x06,0x20,0x3a,
-0x06,0x0c,0x20,0x40,0x06,0x0e,0x24,0x74,0x00,0x00,0x20,0x40,0x01,0x09,0x70,0x0a,
-0xff,0x35,0x58,0x00,0x00,0x04,0x20,0x40,0x50,0xa5,0x6f,0xe8,0x49,0x0d,0xe7,0xe8,
-0x00,0x0a,0x20,0x20,0x67,0xb9,0xda,0x20,0x00,0x01,0x20,0x20,0x03,0xfd,0x20,0x40,
-0x7d,0xc1,0x1f,0xf0,0xa6,0x00,0x18,0xc0,0x8c,0x04,0x18,0xc2,0x22,0x00,0x6f,0xe2,
-0x48,0xce,0x1f,0xe2,0x72,0x00,0xda,0x40,0x48,0xcf,0x20,0x40,0x7d,0x63,0x24,0x62,
-0x80,0x00,0x1a,0x20,0x8c,0x04,0x1a,0x62,0x72,0x00,0x18,0xc2,0x22,0x00,0x18,0xc0,
-0x8c,0x0a,0xef,0xe4,0x00,0x06,0x1f,0xf0,0xfe,0x00,0x98,0xc0,0x8c,0x00,0xc2,0x00,
-0x06,0x19,0x1a,0x20,0x8c,0x03,0xef,0xe2,0x00,0x06,0xc1,0x80,0x80,0x00,0x18,0xc0,
-0x8c,0x08,0xef,0xe8,0x00,0x06,0x67,0xe8,0x49,0x0d,0x20,0x20,0x7d,0xbf,0x6f,0xe2,
-0x48,0xce,0x1f,0xe0,0x84,0x18,0x20,0x40,0x02,0xb1,0x6f,0xe8,0x49,0xad,0x67,0xe8,
-0x48,0xb6,0x70,0x48,0xa7,0x00,0x58,0x00,0x00,0x35,0x1f,0xf0,0xfe,0x00,0x67,0xe4,
-0x48,0xbc,0x18,0x0a,0x7e,0x00,0x67,0xe4,0x48,0xba,0x20,0x40,0x02,0x93,0x20,0x40,
-0x05,0x91,0x58,0x00,0x00,0x01,0xe7,0xe6,0x00,0x05,0xe7,0xee,0x00,0x05,0x6f,0xe2,
-0x48,0xce,0x98,0x00,0x72,0x00,0x20,0x40,0x7c,0xcf,0x58,0x00,0x01,0x00,0xe7,0xe4,
-0x00,0x05,0xe7,0xe4,0x00,0x05,0x20,0x20,0x02,0xb8,0x6f,0xe4,0x46,0x52,0xc2,0x86,
-0x80,0xda,0x6f,0xe2,0x48,0x9a,0x1f,0xe0,0xfe,0x01,0x1f,0xe6,0x7c,0x05,0x24,0x21,
-0x00,0xf2,0x67,0xe2,0x48,0x9a,0x70,0x48,0x99,0x05,0x20,0x60,0x00,0x00,0xda,0x60,
-0x48,0x99,0xda,0x40,0x06,0x4e,0x20,0x20,0x4d,0x04,0xda,0x20,0x00,0x04,0x20,0x40,
-0x02,0x6d,0x58,0x00,0x06,0x01,0xe7,0xe8,0x00,0x05,0x20,0x20,0x51,0xd6,0x6f,0xe2,
-0x02,0x26,0xc1,0x80,0x80,0x00,0x6f,0xe2,0x48,0x97,0xc1,0x80,0x00,0x00,0x70,0x48,
-0x97,0x01,0xda,0x20,0x00,0x7f,0x20,0x40,0x56,0x1a,0x1f,0xe2,0x0a,0x00,0x58,0x00,
-0x00,0x08,0xe7,0xe4,0x00,0x05,0xd8,0xc0,0x49,0xbe,0x20,0x20,0x7c,0x9a,0x18,0xc0,
-0x8c,0x03,0xe8,0x44,0x00,0x06,0x18,0xc0,0x8c,0x02,0xef,0xe4,0x00,0x06,0xc0,0x80,
-0x51,0xd5,0x60,0x44,0x48,0x95,0x6f,0xe4,0x02,0x67,0x20,0x40,0x06,0x74,0x20,0x20,
-0x51,0xd6,0xe8,0x42,0x00,0x06,0x60,0x42,0x49,0xcd,0x6f,0xe4,0x48,0x95,0x67,0xe4,
-0x49,0xd0,0x70,0x48,0x97,0x02,0x6f,0xe4,0x02,0x67,0x1f,0xe2,0x0a,0x00,0xd8,0xc0,
-0x49,0xc8,0x20,0x40,0x7c,0x9a,0x20,0x20,0x51,0xd6,0x70,0x48,0x97,0x00,0xda,0x20,
-0x00,0x07,0x20,0x40,0x02,0x6d,0xd8,0xc0,0x49,0xd6,0x20,0x20,0x7c,0x94,0x70,0x48,
-0x98,0x02,0x20,0x20,0x51,0xd6,0x60,0x44,0x49,0xe5,0xd8,0xc0,0x49,0xdd,0x1f,0xe2,
-0x0a,0x00,0x20,0x20,0x7c,0x9a,0x6f,0xe2,0x48,0x97,0xc0,0x01,0x06,0x6d,0x20,0x60,
-0x00,0x00,0xda,0x60,0x48,0x98,0xda,0x40,0x06,0x7e,0x20,0x20,0x4d,0x04,0x6f,0xe4,
-0x46,0x52,0xc3,0x86,0x80,0x00,0x70,0x0a,0x95,0x42,0x20,0x20,0x7b,0xab,0x20,0x40,
-0x00,0xe4,0x20,0x40,0x06,0x87,0x70,0x0a,0x95,0x43,0x20,0x40,0x7b,0xab,0x20,0x20,
-0x51,0xd6,0x6f,0xe4,0x02,0x67,0x1f,0xe2,0x0a,0x00,0x58,0x00,0x00,0x08,0xe7,0xe4,
-0x00,0x05,0x18,0x00,0x7e,0x01,0xe7,0xe4,0x00,0x05,0x20,0x20,0x55,0xe0,0xc5,0x07,
-0xc6,0x1c,0x6f,0xe4,0x01,0x5d,0xd8,0x40,0x02,0xe0,0x98,0x46,0x7c,0x00,0x20,0x21,
-0x46,0x39,0x6f,0xe2,0x02,0x5f,0xc3,0x00,0x45,0xc5,0x20,0x20,0x46,0x49,0x6f,0xe4,
-0x02,0x59,0x68,0x44,0x01,0x5d,0x98,0x40,0xfe,0x00,0x67,0xe4,0x02,0x59,0x20,0x7a,
-0x00,0x00,0x20,0x20,0x45,0xfa,0xda,0x40,0x00,0x00,0x20,0x40,0x56,0x48,0x24,0x3a,
-0x4a,0x8b,0x20,0x40,0x56,0x58,0xda,0x40,0x18,0x00,0xd8,0xe0,0x00,0x00,0x68,0x42,
-0x42,0x28,0xa8,0x4f,0xff,0xff,0x20,0x20,0x86,0xaa,0x20,0x40,0x56,0x7a,0x19,0x66,
-0x7c,0x00,0x20,0x21,0x06,0xaa,0x20,0x40,0x56,0x62,0x20,0x20,0x56,0x2f,0x1a,0x40,
-0xa4,0x80,0x1a,0x40,0xa4,0x80,0x18,0xe0,0x8e,0x01,0x58,0x00,0x00,0x08,0x98,0xe6,
-0x7c,0x00,0x20,0x21,0x06,0xa2,0xda,0x40,0x00,0x00,0x20,0x20,0x56,0x2f,0x20,0x40,
-0x56,0x58,0x18,0xe2,0x26,0x00,0xd8,0x40,0x00,0x00,0xd9,0x60,0x00,0x00,0x18,0xe2,
-0x7e,0x00,0xc0,0x04,0x56,0x8a,0x6f,0xe2,0x42,0x28,0xaf,0xef,0xff,0xff,0x20,0x20,
-0xd6,0x8a,0x18,0x40,0x84,0x80,0x18,0x40,0x84,0x80,0x18,0xe0,0x8e,0x01,0x1a,0x22,
-0x7e,0x00,0x98,0x46,0x7c,0x00,0x20,0x22,0xd6,0x8a,0x20,0x21,0x06,0xb6,0x20,0x20,
-0x56,0x8a,0x6f,0xe2,0x02,0x64,0xc0,0x24,0x06,0xc6,0x20,0x20,0x54,0xcc,0x6f,0xe4,
-0x02,0x60,0x98,0x00,0x0c,0x00,0xef,0xe2,0x00,0x06,0x67,0xe2,0x0b,0x0e,0xc0,0x00,
-0x06,0xd0,0xc0,0x00,0x86,0xd4,0xc0,0x01,0x06,0xd8,0xc0,0x01,0x86,0xd9,0xc0,0x02,
-0x06,0xdc,0x20,0x20,0x51,0xd6,0xef,0xec,0x00,0x06,0xef,0xec,0x00,0x06,0x67,0xec,
-0x49,0xb7,0x20,0x20,0x06,0xde,0xef,0xe6,0x00,0x06,0xc0,0x02,0x86,0x49,0xc0,0x81,
-0x51,0xd6,0x20,0x20,0x06,0x72,0x20,0x20,0x06,0xde,0xef,0xec,0x00,0x06,0x67,0xec,
-0x49,0xb7,0x20,0x20,0x06,0xde,0x18,0xc0,0x8c,0x06,0x20,0x20,0x06,0xde,0xef,0xe4,
-0x00,0x06,0xd8,0x40,0x00,0x08,0x98,0x46,0x7c,0x00,0x20,0x22,0x83,0x72,0xd8,0x40,
-0x06,0x08,0x98,0x46,0x7c,0x00,0x20,0x22,0x83,0x2c,0x20,0x20,0x51,0xd6,0xd8,0x40,
-0x00,0x0c,0x20,0x40,0x5b,0x4d,0x18,0xc0,0x8b,0xfe,0x58,0x00,0x00,0x00,0xe7,0xe4,
-0x00,0x05,0x20,0x20,0x50,0x1f,0x20,0x40,0x06,0xf5,0x20,0x40,0x07,0x12,0x58,0x00,
-0x00,0x00,0xe7,0xe4,0x00,0x05,0x20,0x20,0x07,0x24,0xef,0xe2,0x00,0x03,0x20,0x40,
-0x06,0xf9,0x20,0x40,0x07,0x00,0x20,0x20,0x07,0x24,0x20,0x40,0x07,0x16,0x5a,0x28,
-0x00,0x02,0xe7,0xe8,0x00,0x05,0x20,0x60,0x00,0x00,0x67,0xe2,0x0a,0x96,0x20,0x40,
-0x07,0x16,0x59,0x28,0x03,0x02,0xe7,0xe8,0x00,0x05,0x6f,0xe2,0x0a,0x96,0xe7,0xe6,
-0x00,0x05,0x20,0x60,0x00,0x00,0x20,0x40,0x07,0x16,0x20,0x40,0x07,0x12,0x20,0x40,
-0x07,0x12,0x58,0x00,0x00,0x00,0xe7,0xe4,0x00,0x05,0x18,0x40,0x85,0xff,0x20,0x40,
-0x5b,0x4d,0x18,0xc0,0x8c,0x04,0xef,0xe2,0x00,0x06,0xc2,0x82,0x07,0x0d,0xc2,0x82,
-0x87,0x0d,0x18,0x40,0x84,0x01,0x20,0x60,0x00,0x00,0x20,0x40,0x07,0x16,0x5a,0x29,
-0x02,0x02,0xe7,0xf0,0x00,0x05,0x18,0x40,0x85,0xff,0x20,0x60,0x00,0x00,0xef,0xe2,
-0x00,0x03,0x1f,0xe2,0x72,0x00,0xe7,0xe2,0x00,0x05,0x20,0x20,0x67,0xed,0x20,0x40,
-0x07,0x19,0xe0,0x44,0x00,0x05,0x20,0x60,0x00,0x00,0x6f,0xe4,0x44,0x8e,0x98,0x00,
-0x0c,0x00,0xef,0xe4,0x00,0x06,0x20,0x7a,0x00,0x00,0x1f,0xe0,0x84,0x01,0xef,0xe2,
-0x00,0x06,0x98,0xc0,0x8c,0x00,0xef,0xe2,0x00,0x06,0x98,0xc0,0x8c,0x00,0x18,0xc2,
-0x0a,0x00,0x20,0x20,0x07,0x1b,0x60,0x44,0x0a,0x9e,0x70,0x0a,0xff,0x29,0x58,0x00,
-0x00,0x02,0x20,0x40,0x50,0xa5,0x68,0x44,0x0a,0x9e,0xe0,0x44,0x00,0x0a,0x20,0x20,
-0x67,0xb9,0x20,0x40,0x4f,0x11,0x20,0x74,0x00,0x00,0x1a,0x22,0x7e,0x00,0x67,0xe4,
-0x46,0x71,0x1a,0x42,0x7e,0x00,0x67,0xe2,0x46,0x70,0x68,0x44,0x04,0x74,0x60,0x44,
-0x46,0x73,0x20,0x40,0x5b,0x6c,0x24,0x3a,0x4a,0x8b,0x6f,0xe2,0x04,0x9e,0xc0,0x81,
-0x50,0x42,0xe8,0x44,0x00,0x06,0x58,0x00,0x29,0x02,0x98,0x46,0x7c,0x00,0x20,0x62,
-0x80,0x00,0x20,0x20,0x50,0x42,0xef,0xe6,0x00,0x06,0x20,0x20,0x5c,0x8c,0x6f,0xe2,
+0x7c,0x01,0x24,0x21,0x50,0x1c,0x20,0x20,0x04,0x4b,0x20,0x40,0x51,0xd6,0xc5,0x18,
+0x85,0x6a,0x1a,0x20,0x8c,0x09,0xef,0xe2,0x00,0x06,0xc0,0x1a,0x86,0x08,0xc0,0x21,
+0x85,0xa4,0xef,0xe4,0x00,0x06,0x1f,0xe2,0x24,0x00,0x6f,0xe4,0x49,0xb4,0x9a,0x46,
+0x7c,0x00,0x24,0x62,0x80,0x00,0x20,0x40,0x05,0x6e,0x1a,0x60,0xff,0xec,0x67,0xe4,
+0x49,0x12,0x1a,0x20,0xfe,0x08,0x67,0xe4,0x49,0x14,0x20,0x20,0x02,0x13,0x6f,0xe4,
+0x49,0xb6,0x98,0x46,0x7c,0x00,0x20,0x22,0x85,0x65,0x20,0x60,0x00,0x00,0x60,0x44,
+0x49,0xb6,0x1a,0x60,0xa7,0xf8,0x70,0x0a,0xff,0x38,0x58,0x00,0x00,0x0c,0x20,0x40,
+0x50,0xa5,0x1a,0x22,0x0c,0x00,0x1a,0x20,0xa2,0x08,0xdf,0x20,0x00,0x0c,0x20,0x40,
+0x67,0xc1,0x20,0x20,0x67,0xb9,0x20,0x40,0x02,0xb4,0xef,0xf0,0x00,0x03,0x67,0xf0,
+0x48,0xb7,0x6f,0xe4,0x48,0xbb,0x67,0xe4,0x49,0xb4,0x6f,0xe2,0x0b,0x00,0x1f,0xf0,
+0x84,0x00,0x60,0x44,0x48,0xbf,0x1f,0xe2,0x04,0x00,0x20,0x40,0x02,0x96,0x6f,0xe2,
+0x0b,0x00,0x1f,0xe0,0xf3,0xf8,0x20,0x40,0x67,0xda,0x20,0x40,0x02,0x49,0x20,0x20,
+0x50,0x1f,0x20,0x40,0x02,0xb4,0x6f,0xf0,0x49,0xfa,0x67,0xf0,0x48,0xb7,0x6f,0xe4,
+0x48,0xbb,0x67,0xe4,0x49,0xb4,0x6f,0xe4,0x49,0xf6,0x1f,0xf0,0x84,0x00,0x60,0x44,
+0x48,0xbf,0x1f,0xe2,0x04,0x00,0x20,0x40,0x02,0x96,0x6f,0xe4,0x49,0xf6,0x1f,0xe0,
+0xf3,0xf8,0xd8,0xc0,0x4a,0x02,0x20,0x40,0x7c,0xcf,0x20,0x40,0x02,0x49,0xda,0x20,
+0x00,0x04,0x20,0x20,0x02,0x0f,0x18,0x0a,0x7e,0x00,0x67,0xe4,0x48,0xc7,0x18,0x0a,
+0x7e,0x00,0xe7,0xe4,0x00,0x05,0x20,0x60,0x00,0x00,0x70,0x48,0xb0,0x11,0x70,0x48,
+0x9d,0x01,0x58,0x00,0x06,0x40,0x20,0x40,0x02,0x2d,0x70,0x0f,0xb0,0x01,0xd8,0x40,
+0x00,0x43,0x20,0x20,0x05,0xdf,0x58,0x00,0x01,0x02,0x9a,0x20,0x8c,0x00,0xef,0xe2,
+0x00,0x06,0xc0,0x01,0x05,0xaa,0xc0,0x02,0x85,0xbc,0x20,0x20,0x51,0xd6,0x6f,0xe2,
+0x48,0x9d,0xc0,0x80,0xd1,0xd6,0x70,0x48,0x9d,0x02,0x1a,0x20,0x8c,0x20,0xef,0xe8,
+0x00,0x06,0x67,0xe8,0x49,0xa4,0x67,0xe8,0x0f,0xee,0xef,0xe8,0x00,0x06,0x67,0xe8,
+0x49,0xae,0x67,0xe8,0x0f,0xf4,0x20,0x40,0x01,0x03,0x20,0x20,0x51,0xd6,0x58,0x00,
+0x06,0x40,0x20,0x40,0x02,0x2d,0x70,0x48,0x9d,0x03,0x70,0x0f,0xb0,0x03,0xd8,0x40,
+0x00,0x4f,0x20,0x20,0x05,0xdf,0x6f,0xe2,0x48,0x9d,0xc0,0x81,0xd1,0xd6,0x20,0x40,
+0x01,0x05,0x70,0x48,0x9d,0x04,0x20,0x20,0x51,0xd6,0x6f,0xe2,0x48,0x9d,0xc0,0x00,
+0x85,0xc8,0xc0,0x01,0x05,0xb6,0xc0,0x01,0x85,0xcb,0xc0,0x02,0x05,0xdb,0xc0,0x03,
+0x05,0xdd,0x20,0x60,0x00,0x00,0x20,0x40,0x05,0xce,0x24,0x74,0x00,0x00,0x20,0x20,
+0x05,0x9d,0x20,0x40,0x05,0xce,0x24,0x74,0x00,0x00,0x20,0x20,0x05,0xb6,0x20,0x40,
+0x7d,0xc1,0x20,0x40,0x02,0x2b,0x24,0x7a,0x00,0x00,0x6f,0xe4,0x48,0xcb,0x1f,0xf0,
+0xfe,0x00,0x1f,0xe0,0xfe,0x01,0x1f,0xf0,0xfe,0x00,0x67,0xe4,0x48,0xcb,0x58,0x00,
+0x06,0x40,0x20,0x40,0x02,0x2d,0x20,0x40,0x56,0x4e,0x24,0x7a,0x00,0x00,0x20,0x20,
+0x7d,0xbf,0x70,0x48,0x9c,0x00,0x20,0x20,0x03,0x4d,0x70,0x48,0x9d,0x09,0x20,0x60,
+0x00,0x00,0x60,0x42,0x0f,0xf9,0x18,0x40,0x84,0xf4,0x20,0x40,0x05,0xf8,0x70,0x48,
+0xa8,0x10,0x18,0x40,0xa2,0x1d,0x20,0x40,0x02,0x7d,0xdf,0x20,0x00,0x31,0x18,0xa0,
+0xa2,0x15,0xd8,0xc0,0x48,0x9e,0x20,0x40,0x7c,0xcf,0xdf,0x20,0x00,0x02,0x20,0x40,
+0x7c,0xa1,0x6f,0xec,0x40,0xa0,0x20,0x40,0x02,0xa4,0xdf,0x20,0x00,0x19,0x20,0x40,
+0x7c,0xa1,0xe7,0xe4,0x00,0x05,0x6f,0xe2,0x0f,0xf9,0x98,0x00,0x72,0x00,0xd8,0xc0,
+0x0f,0xaa,0x20,0x40,0x7c,0xcf,0x18,0xa0,0x8b,0xff,0x58,0x00,0x00,0xff,0xe7,0xe2,
+0x00,0x05,0x20,0x20,0x02,0xbb,0x58,0x00,0x00,0x00,0x67,0xe8,0x48,0xb3,0x5f,0xff,
+0xff,0xff,0xe7,0xe8,0x00,0x05,0x58,0x00,0x00,0x44,0x1f,0xf0,0xfe,0x00,0xe7,0xe4,
+0x00,0x05,0x58,0x00,0x00,0x43,0x1f,0xf0,0xfe,0x00,0xe7,0xe4,0x00,0x05,0x20,0x60,
+0x00,0x00,0xda,0x60,0x48,0x9c,0xda,0x40,0x06,0x06,0x20,0x20,0x4d,0x04,0x20,0x40,
+0x00,0xfb,0x20,0x20,0x4d,0x64,0x20,0x40,0x51,0xd6,0x1a,0x20,0x8c,0x16,0xef,0xe4,
+0x00,0x06,0x20,0x3a,0x06,0x15,0x20,0x40,0x06,0x17,0x24,0x74,0x00,0x00,0x20,0x40,
+0x01,0x09,0x70,0x0a,0xff,0x35,0x58,0x00,0x00,0x04,0x20,0x40,0x50,0xa5,0x6f,0xe8,
+0x49,0x0e,0xe7,0xe8,0x00,0x0a,0x20,0x20,0x67,0xb9,0xda,0x20,0x00,0x01,0x20,0x20,
+0x04,0x01,0x20,0x40,0x7d,0xc1,0x1f,0xf0,0xa6,0x00,0x18,0xc0,0x8c,0x04,0x18,0xc2,
+0x22,0x00,0x6f,0xe2,0x48,0xcf,0x1f,0xe2,0x72,0x00,0xda,0x40,0x48,0xd0,0x20,0x40,
+0x7d,0x63,0x24,0x62,0x80,0x00,0x1a,0x20,0x8c,0x04,0x1a,0x62,0x72,0x00,0x18,0xc2,
+0x22,0x00,0x18,0xc0,0x8c,0x0a,0xef,0xe4,0x00,0x06,0x1f,0xf0,0xfe,0x00,0x98,0xc0,
+0x8c,0x00,0xc2,0x00,0x06,0x22,0x1a,0x20,0x8c,0x03,0xef,0xe2,0x00,0x06,0xc1,0x80,
+0x80,0x00,0x18,0xc0,0x8c,0x08,0xef,0xe8,0x00,0x06,0x67,0xe8,0x49,0x0e,0x20,0x20,
+0x7d,0xbf,0x6f,0xe2,0x48,0xcf,0x1f,0xe0,0x84,0x18,0x20,0x40,0x02,0xb4,0x6f,0xe8,
+0x49,0xae,0x67,0xe8,0x48,0xb7,0x70,0x48,0xa8,0x00,0x58,0x00,0x00,0x35,0x1f,0xf0,
+0xfe,0x00,0x67,0xe4,0x48,0xbd,0x18,0x0a,0x7e,0x00,0x67,0xe4,0x48,0xbb,0x20,0x40,
+0x02,0x96,0x20,0x40,0x05,0x9a,0x58,0x00,0x00,0x01,0xe7,0xe6,0x00,0x05,0xe7,0xee,
+0x00,0x05,0x6f,0xe2,0x48,0xcf,0x98,0x00,0x72,0x00,0x20,0x40,0x7c,0xcf,0x58,0x00,
+0x01,0x00,0xe7,0xe4,0x00,0x05,0xe7,0xe4,0x00,0x05,0x20,0x20,0x02,0xbb,0x6f,0xe4,
+0x46,0x52,0xc2,0x86,0x80,0xda,0x6f,0xe2,0x48,0x9b,0x1f,0xe0,0xfe,0x01,0x1f,0xe6,
+0x7c,0x05,0x24,0x21,0x00,0xf2,0x67,0xe2,0x48,0x9b,0x70,0x48,0x9a,0x05,0x20,0x60,
+0x00,0x00,0xda,0x60,0x48,0x9a,0xda,0x40,0x06,0x57,0x20,0x20,0x4d,0x04,0xda,0x20,
+0x00,0x04,0x20,0x40,0x02,0x70,0x58,0x00,0x06,0x01,0xe7,0xe8,0x00,0x05,0x20,0x20,
+0x51,0xd6,0x6f,0xe2,0x02,0x26,0xc1,0x80,0x80,0x00,0x6f,0xe2,0x48,0x96,0xc1,0x80,
+0x00,0x00,0x70,0x48,0x96,0x01,0xda,0x20,0x00,0x7f,0x20,0x40,0x56,0x1a,0x1f,0xe2,
+0x0a,0x00,0x58,0x00,0x00,0x08,0xe7,0xe4,0x00,0x05,0xd8,0xc0,0x49,0xc0,0x20,0x20,
+0x7c,0x9a,0x18,0xc0,0x8c,0x03,0xe8,0x44,0x00,0x06,0x18,0xc0,0x8c,0x02,0xef,0xe4,
+0x00,0x06,0xc0,0x80,0x51,0xd5,0x60,0x44,0x48,0x94,0x6f,0xe4,0x02,0x67,0x20,0x40,
+0x06,0x8d,0x20,0x20,0x51,0xd6,0xe8,0x42,0x00,0x06,0x60,0x42,0x49,0xcf,0x6f,0xe4,
+0x48,0x94,0x67,0xe4,0x49,0xd2,0x70,0x48,0x96,0x02,0x6f,0xe4,0x02,0x67,0x1f,0xe2,
+0x0a,0x00,0xd8,0xc0,0x49,0xca,0x20,0x40,0x7c,0x9a,0x20,0x20,0x51,0xd6,0x70,0x48,
+0x96,0x00,0xda,0x20,0x00,0x07,0x20,0x40,0x02,0x70,0xd8,0xc0,0x49,0xd8,0x20,0x20,
+0x7c,0x94,0x20,0x40,0x51,0xd6,0xef,0xe4,0x00,0x06,0x24,0x3a,0x06,0x80,0x70,0x48,
+0x97,0x02,0x20,0x20,0x06,0x87,0x70,0x48,0x98,0x05,0x6f,0xe2,0x48,0x99,0x1f,0xe0,
+0xfe,0x01,0x67,0xe2,0x48,0x99,0xc1,0x8f,0x00,0x00,0x20,0x40,0x06,0x87,0x20,0x20,
+0x00,0xf2,0x58,0x00,0x00,0x00,0x67,0xe4,0x48,0x98,0x20,0x60,0x00,0x00,0xda,0x60,
+0x48,0x98,0xda,0x40,0x06,0x76,0x20,0x20,0x4d,0x04,0x60,0x44,0x49,0xe7,0xd8,0xc0,
+0x49,0xdf,0x1f,0xe2,0x0a,0x00,0x20,0x20,0x7c,0x9a,0x6f,0xe2,0x48,0x96,0xc0,0x01,
+0x06,0x76,0x20,0x60,0x00,0x00,0xda,0x60,0x48,0x97,0xda,0x40,0x06,0x97,0x20,0x20,
+0x4d,0x04,0x6f,0xe4,0x46,0x52,0xc3,0x86,0x80,0x00,0x70,0x0a,0x95,0x42,0x20,0x20,
+0x7b,0xab,0x20,0x40,0x00,0xe4,0x20,0x40,0x06,0xa0,0x70,0x0a,0x95,0x43,0x20,0x40,
+0x7b,0xab,0x20,0x20,0x51,0xd6,0x6f,0xe4,0x02,0x67,0x1f,0xe2,0x0a,0x00,0x58,0x00,
+0x00,0x08,0xe7,0xe4,0x00,0x05,0x18,0x00,0x7e,0x01,0xe7,0xe4,0x00,0x05,0x20,0x20,
+0x55,0xe0,0xc5,0x07,0xc6,0x1c,0x6f,0xe4,0x01,0x5d,0xd8,0x40,0x02,0xe0,0x98,0x46,
+0x7c,0x00,0x20,0x21,0x46,0x39,0x6f,0xe2,0x02,0x5f,0xc3,0x00,0x45,0xc5,0x20,0x20,
+0x46,0x49,0x6f,0xe4,0x02,0x59,0x68,0x44,0x01,0x5d,0x98,0x40,0xfe,0x00,0x67,0xe4,
+0x02,0x59,0x20,0x7a,0x00,0x00,0x20,0x20,0x45,0xfa,0xda,0x40,0x00,0x00,0x20,0x40,
+0x56,0x48,0x24,0x3a,0x4a,0x8b,0x20,0x40,0x56,0x58,0xda,0x40,0x18,0x00,0xd8,0xe0,
+0x00,0x00,0x68,0x42,0x42,0x28,0xa8,0x4f,0xff,0xff,0x20,0x20,0x86,0xc3,0x20,0x40,
+0x56,0x7a,0x19,0x66,0x7c,0x00,0x20,0x21,0x06,0xc3,0x20,0x40,0x56,0x62,0x20,0x20,
+0x56,0x2f,0x1a,0x40,0xa4,0x80,0x1a,0x40,0xa4,0x80,0x18,0xe0,0x8e,0x01,0x58,0x00,
+0x00,0x08,0x98,0xe6,0x7c,0x00,0x20,0x21,0x06,0xbb,0xda,0x40,0x00,0x00,0x20,0x20,
+0x56,0x2f,0x20,0x40,0x56,0x58,0x18,0xe2,0x26,0x00,0xd8,0x40,0x00,0x00,0xd9,0x60,
+0x00,0x00,0x18,0xe2,0x7e,0x00,0xc0,0x04,0x56,0x8a,0x6f,0xe2,0x42,0x28,0xaf,0xef,
+0xff,0xff,0x20,0x20,0xd6,0x8a,0x18,0x40,0x84,0x80,0x18,0x40,0x84,0x80,0x18,0xe0,
+0x8e,0x01,0x1a,0x22,0x7e,0x00,0x98,0x46,0x7c,0x00,0x20,0x22,0xd6,0x8a,0x20,0x21,
+0x06,0xcf,0x20,0x20,0x56,0x8a,0x20,0x40,0x56,0x4b,0x24,0x7a,0x00,0x00,0x6f,0xe2,
+0x02,0x64,0xc0,0x24,0x06,0xe1,0x20,0x20,0x54,0xcc,0x6f,0xe4,0x02,0x60,0x98,0x00,
+0x0c,0x00,0xef,0xe2,0x00,0x06,0x67,0xe2,0x0b,0x0e,0xc0,0x00,0x06,0xeb,0xc0,0x00,
+0x86,0xef,0xc0,0x01,0x06,0xf3,0xc0,0x01,0x86,0xf4,0xc0,0x02,0x06,0xf7,0x20,0x20,
+0x51,0xd6,0xef,0xec,0x00,0x06,0xef,0xec,0x00,0x06,0x67,0xec,0x49,0xb8,0x20,0x20,
+0x06,0xf9,0xef,0xe2,0x00,0x06,0xc0,0x02,0x86,0x52,0xc0,0x81,0x51,0xd6,0x20,0x20,
+0x06,0x7b,0x20,0x20,0x06,0xf9,0xef,0xec,0x00,0x06,0x67,0xec,0x49,0xb8,0x20,0x20,
+0x06,0xf9,0x18,0xc0,0x8c,0x06,0x20,0x20,0x06,0xf9,0xef,0xe4,0x00,0x06,0xd8,0x40,
+0x00,0x08,0x98,0x46,0x7c,0x00,0x20,0x22,0x83,0x75,0xd8,0x40,0x06,0x08,0x98,0x46,
+0x7c,0x00,0x20,0x22,0x83,0x2f,0x20,0x20,0x51,0xd6,0xd8,0x40,0x00,0x0c,0x20,0x40,
+0x5b,0x4d,0x18,0xc0,0x8b,0xfe,0x58,0x00,0x00,0x00,0xe7,0xe4,0x00,0x05,0x20,0x20,
+0x50,0x1f,0x20,0x40,0x07,0x16,0x20,0x40,0x07,0x33,0x58,0x00,0x00,0x00,0xe7,0xe4,
+0x00,0x05,0x20,0x20,0x07,0x0f,0xef,0xe2,0x00,0x03,0x20,0x40,0x07,0x1a,0x20,0x40,
+0x07,0x21,0x60,0x44,0x0a,0x9e,0x70,0x0a,0xff,0x29,0x58,0x00,0x00,0x02,0x20,0x40,
+0x50,0xa5,0x68,0x44,0x0a,0x9e,0xe0,0x44,0x00,0x0a,0x20,0x20,0x67,0xb9,0x20,0x40,
+0x07,0x37,0x58,0x28,0x00,0x02,0xe7,0xe6,0x00,0x05,0x20,0x60,0x00,0x00,0x67,0xe2,
+0x0a,0x96,0x20,0x40,0x07,0x37,0x59,0x28,0x03,0x02,0xe7,0xe8,0x00,0x05,0x6f,0xe2,
+0x0a,0x96,0xe7,0xe6,0x00,0x05,0x20,0x60,0x00,0x00,0x20,0x40,0x07,0x37,0x20,0x40,
+0x07,0x33,0x20,0x40,0x07,0x33,0x58,0x00,0x00,0x00,0xe7,0xe4,0x00,0x05,0x18,0x40,
+0x85,0xff,0x20,0x40,0x5b,0x4d,0x18,0xc0,0x8c,0x04,0xef,0xe2,0x00,0x06,0xc2,0x82,
+0x07,0x2e,0xc2,0x82,0x87,0x2e,0x18,0x40,0x84,0x01,0x20,0x60,0x00,0x00,0x20,0x40,
+0x07,0x37,0x5a,0x29,0x02,0x02,0xe7,0xf0,0x00,0x05,0x18,0x40,0x85,0xff,0x20,0x60,
+0x00,0x00,0xef,0xe2,0x00,0x03,0x1f,0xe2,0x72,0x00,0xe7,0xe2,0x00,0x05,0x20,0x20,
+0x67,0xed,0x20,0x40,0x07,0x3a,0xe0,0x44,0x00,0x05,0x20,0x60,0x00,0x00,0x6f,0xe4,
+0x44,0x8e,0x98,0x00,0x0c,0x00,0xef,0xe4,0x00,0x06,0x20,0x7a,0x00,0x00,0x1f,0xe0,
+0x84,0x01,0xef,0xe2,0x00,0x06,0x98,0xc0,0x8c,0x00,0xef,0xe2,0x00,0x06,0x98,0xc0,
+0x8c,0x00,0x18,0xc2,0x0a,0x00,0x20,0x20,0x07,0x3c,0x20,0x40,0x4f,0x11,0x20,0x74,
+0x00,0x00,0x1a,0x22,0x7e,0x00,0x67,0xe4,0x46,0x71,0x1a,0x42,0x7e,0x00,0x67,0xe2,
+0x46,0x70,0x68,0x44,0x04,0x74,0x60,0x44,0x46,0x73,0x20,0x40,0x5b,0x6c,0x24,0x3a,
+0x4a,0x8b,0x6f,0xe2,0x04,0x9e,0xc0,0x81,0x50,0x42,0xe8,0x44,0x00,0x06,0x58,0x00,
+0x29,0x02,0x98,0x46,0x7c,0x00,0x20,0x62,0x80,0x00,0x20,0x20,0x50,0x42,0x6f,0xe2,
 0x44,0x90,0x20,0x3a,0x5e,0xd0,0x20,0x40,0x74,0x38,0x20,0x20,0x79,0x32,0x6f,0xe2,
 0x44,0x96,0xc0,0x01,0xdf,0xd7,0x20,0x40,0x5c,0x74,0x24,0x7a,0x00,0x00,0x20,0x20,
 0x5f,0xc5,0x20,0x40,0x49,0xba,0x78,0x23,0xfc,0x00,0x78,0x24,0xfc,0x00,0x09,0x80,
 0x00,0x08,0x19,0x89,0x7e,0x00,0x67,0xe2,0x02,0xd5,0x09,0x80,0x00,0x08,0x19,0x89,
 0x7e,0x00,0xe7,0xe2,0x00,0x05,0x1f,0xe1,0x72,0x3f,0x20,0x22,0xd8,0x8b,0x1f,0xe6,
-0x7c,0x33,0x24,0x41,0x07,0x55,0x20,0x20,0x58,0x87,0xdf,0x20,0x00,0x33,0x20,0x60,
+0x7c,0x33,0x24,0x41,0x07,0x6d,0x20,0x20,0x58,0x87,0xdf,0x20,0x00,0x33,0x20,0x60,
 0x00,0x00,0x20,0x40,0x58,0xa3,0x20,0x40,0x49,0x15,0x68,0x42,0x00,0x17,0x20,0x40,
 0x49,0x1c,0x20,0x00,0x05,0xdc,0x20,0x40,0x49,0x21,0x78,0x28,0x7c,0x00,0xd9,0x60,
-0x15,0x7c,0x20,0x20,0x58,0x69,0x20,0x40,0x57,0xaf,0x20,0x40,0x07,0x63,0x20,0x20,
-0x58,0xa7,0x20,0x36,0x87,0xce,0x20,0x20,0x57,0xbe,0xc6,0x07,0x80,0x00,0x20,0x40,
+0x15,0x7c,0x20,0x20,0x58,0x69,0x20,0x40,0x57,0xaf,0x20,0x40,0x07,0x7b,0x20,0x20,
+0x58,0xa7,0x20,0x36,0x87,0xef,0x20,0x20,0x57,0xbe,0xc6,0x07,0x80,0x00,0x20,0x40,
 0x5c,0x70,0x24,0x7a,0x00,0x00,0x6f,0xe2,0x02,0xd5,0x1f,0xe1,0x7e,0x03,0x67,0xe2,
 0x44,0xde,0xef,0xe2,0x00,0x06,0x1f,0xe1,0x7e,0x1f,0x67,0xe2,0x44,0xdd,0x20,0x7a,
 0x00,0x00,0x18,0xc2,0x7e,0x00,0x67,0xe4,0x44,0xdf,0x6f,0xe2,0x44,0xde,0xc0,0x01,
 0xe0,0x44,0x20,0x40,0x5a,0x76,0xd8,0xe0,0x00,0x03,0x24,0x34,0x4b,0xec,0x20,0x40,
-0x4b,0xf0,0x20,0x20,0x5a,0x6b,0xef,0xe4,0x00,0x06,0xc0,0x02,0x07,0x3c,0x20,0x20,
-0x5a,0x72,0x6f,0xe4,0x48,0x8f,0x1f,0xe0,0x8a,0x02,0x58,0x00,0x00,0x00,0xe7,0xe6,
-0x00,0x05,0x20,0x60,0x00,0x00,0x20,0x40,0x7d,0xc1,0x20,0x40,0x07,0xac,0x20,0x7a,
-0x00,0x00,0x6f,0xe4,0x48,0x8f,0x1f,0xe0,0xa4,0x02,0xe8,0x42,0x00,0x12,0x18,0x40,
-0x84,0x01,0xe0,0x42,0x00,0x12,0xe8,0x42,0x00,0x3f,0x18,0x42,0x72,0x00,0x1f,0xe0,
-0xa4,0x04,0xef,0xe2,0x00,0x12,0x98,0x4f,0xfe,0x00,0x98,0xc0,0x8a,0x00,0x1a,0x22,
-0x0c,0x00,0x20,0x40,0x7c,0xdc,0x20,0x40,0x07,0xb0,0x1f,0xe0,0xff,0xff,0xe8,0x42,
-0x00,0x12,0x18,0x40,0x84,0x01,0x98,0x41,0x04,0x00,0xe0,0x42,0x00,0x12,0x20,0x20,
-0x7d,0xbf,0x20,0x40,0x7d,0xc1,0x20,0x40,0x07,0xa8,0x20,0x7a,0x00,0x00,0x6f,0xe4,
-0x48,0x8f,0x1f,0xe0,0xa4,0x02,0xe8,0x42,0x00,0x12,0x18,0x40,0x85,0xff,0xe0,0x42,
-0x00,0x12,0xe8,0x42,0x00,0x3f,0x18,0x42,0x72,0x00,0x1f,0xe0,0xa4,0x03,0xef,0xe2,
-0x00,0x12,0x98,0x4f,0xfe,0x00,0x98,0xc0,0x8c,0x00,0x18,0xc0,0x8c,0x01,0x1a,0x22,
-0x0a,0x00,0x20,0x20,0x07,0x8f,0x6f,0xe4,0x48,0x8f,0x1f,0xe0,0x8c,0x02,0xef,0xe2,
-0x00,0x06,0x20,0x60,0x00,0x00,0x20,0x40,0x07,0xb0,0xe8,0x42,0x00,0x06,0x98,0x46,
-0x7e,0x00,0x20,0x60,0x00,0x00,0x6f,0xe4,0x48,0x8f,0x1f,0xe0,0x8c,0x01,0xef,0xe2,
-0x00,0x06,0x20,0x60,0x00,0x00,0x20,0x30,0x87,0xc4,0x70,0x89,0x55,0xd4,0x20,0x00,
-0x00,0x04,0x70,0x89,0x55,0xd2,0x20,0x00,0x00,0x04,0x70,0x89,0x55,0xd1,0x20,0x00,
-0x00,0x04,0x6f,0xe2,0x41,0xdf,0xc0,0x00,0x07,0xc2,0xc0,0x00,0x87,0xc6,0xc0,0x01,
-0x07,0xc2,0xc0,0x01,0x87,0xc6,0xc0,0x02,0x07,0xc6,0xc0,0x10,0x07,0xc6,0x70,0x89,
-0x55,0xd0,0x70,0x89,0x56,0xe0,0x18,0x00,0x2a,0x08,0x20,0x20,0x49,0x06,0x70,0x89,
-0x55,0xd0,0x70,0x89,0x56,0xc0,0x20,0x20,0x07,0xc4,0x60,0x42,0x00,0x17,0x20,0x40,
-0x49,0x2a,0x20,0x40,0x49,0x80,0x58,0x00,0x05,0x00,0x20,0x40,0x4a,0x8e,0x6f,0xe2,
-0x89,0x06,0x79,0x20,0x7e,0x00,0x67,0xe2,0x89,0x06,0x20,0x20,0x49,0x37,0x6f,0xe2,
-0x04,0xf9,0xc0,0x77,0x87,0xd5,0x20,0x20,0x69,0x56,0x6f,0xe4,0x04,0xfd,0x1f,0xe2,
-0x0c,0x00,0x20,0x40,0x69,0x84,0x6f,0xe2,0x04,0xff,0xc0,0x38,0x07,0xdb,0x20,0x20,
-0x69,0x60,0x70,0x0a,0x95,0x08,0x20,0x40,0x7b,0xab,0x20,0x40,0x69,0x72,0x20,0x20,
-0x69,0xba,0x92,0xa1,0xaa,0x55,0x40,0x00,0x00,0x40,0x82,0x00,0x88,0x40,0x40,0x00,
-0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x04,0x00,
-0x00,0x09,0x02,0x89,0x30,0x08,0x10,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,
-0x08,0x74,0x12,0x80,0x04,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x08,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x55,0x01,0x00,0x92,0x40,
-0x0a,0xaa,0x55,0x01,0x00,0x54,0x46,0x40,0xaa,0x55,0x01,0x00,0x06,0x42,0x13,0xaa,
-0x55,0x08,0x00,0x98,0x40,0xdf,0xfb,0x8f,0xf8,0x8b,0x85,0x59,0x83,0xaa,0x55,0x03,
-0x00,0x14,0x42,0xd5,0x47,0x05,0xaa,0x55,0x04,0x00,0x3d,0x45,0x00,0x7f,0x00,0x07,
-0xaa,0x55,0x03,0x00,0x2d,0x46,0x03,0x00,0x04,0xaa,0x55,0x01,0x00,0x2c,0x46,0x01,
-0xaa,0x55,0x06,0x00,0x57,0x46,0x04,0x30,0x30,0x30,0x30,0x30,0xaa,0x55,0x10,0x00,
-0xf0,0x4f,0x05,0x17,0xff,0x17,0x05,0x17,0x05,0x17,0x00,0x16,0x04,0x17,0x00,0x16,
-0x00,0x16,0xaa,0x55,0x02,0x00,0x68,0x46,0x00,0x32,0xaa,0x55,0x01,0x00,0x6c,0x46,
-0x03,0xaa,0x55,0x01,0x00,0x6f,0x46,0x07,0xaa,0x55,0x03,0x00,0xaa,0x40,0x0c,0x02,
-0x5a,0xaa,0x55,0x01,0x00,0x79,0x46,0x00,0xaa,0x55,0x01,0x00,0x91,0x40,0x00,0xaa,
-0x55,0x03,0x00,0x54,0x41,0x00,0x01,0x08,0xaa,0x55,0x01,0x00,0x74,0x41,0x02,0xaa,
-0x55,0x01,0x00,0x93,0x40,0x00,0xaa,0x55,0x01,0x00,0x6d,0x46,0x28,0xaa,0x55,0x06,
-0x00,0xa0,0x40,0x78,0xca,0xa1,0x31,0x13,0x12,0xaa,0x55,0x15,0x00,0xe7,0x44,0x14,
-0x59,0x69,0x63,0x68,0x69,0x70,0x20,0x33,0x31,0x32,0x31,0x20,0x4d,0x6f,0x75,0x20,
-0x54,0x65,0x73,0x74,0xaa,0x55,0x03,0x00,0xe4,0x41,0x20,0x00,0x01,0xaa,0x55,0x01,
-0x00,0xe8,0x41,0x00,0xaa,0x55,0x01,0x00,0x90,0x44,0x01,0xaa,0x55,0x01,0x00,0x5f,
-0x44,0x07,0xaa,0x55,0x01,0x00,0x98,0x44,0x00,0xaa,0x55,0x04,0x00,0x75,0x46,0x2d,
-0x00,0x2f,0x00,0xaa,0x55,0x01,0x00,0x40,0x43,0x00,0xaa,0x55,0x02,0x00,0x54,0x44,
-0x40,0x00,0xaa,0x55,0x01,0x00,0x6e,0x46,0x05,0xaa,0x55,0x06,0x00,0x72,0x44,0x21,
-0x22,0x01,0x33,0x02,0x3a,0xaa,0x55,0x0d,0x00,0x81,0x43,0x0c,0x33,0x31,0x32,0x31,
-0x20,0x4d,0x6f,0x75,0x20,0x42,0x6c,0x65,0xaa,0x55,0x04,0x00,0x41,0x43,0x03,0x02,
-0x01,0x02,0xaa,0x55,0x16,0x00,0x61,0x43,0x0e,0x02,0x01,0x02,0x11,0x09,0x59,0x69,
-0x63,0x68,0x69,0x70,0x20,0x31,0x30,0x32,0x31,0x73,0x20,0x4d,0x6f,0x75,0xaa,0x55,
-0x07,0x00,0x25,0x44,0x02,0x03,0x00,0x05,0x10,0x02,0x03,0xaa,0x55,0x08,0x00,0x68,
-0x44,0x08,0x00,0x10,0x00,0x00,0x00,0x2c,0x01,0xaa,0x55,0x01,0x00,0x78,0x44,0xb9,
-0xaa,0x55,0x01,0x00,0x7a,0x44,0x17,0xaa,0x55,0x02,0x00,0xcc,0x44,0x31,0x00,0xaa,
-0x55,0x01,0x00,0xd1,0x40,0x01,0xaa,0x55,0x0c,0x00,0x49,0x45,0x05,0x03,0x00,0x12,
-0x00,0x01,0x01,0x00,0x01,0x11,0x03,0x00,0xaa,0x55,0x12,0x00,0x5f,0x45,0x01,0x07,
-0x00,0x00,0x00,0x00,0xde,0xca,0xfa,0xde,0xde,0xca,0xde,0xaf,0xde,0xca,0xca,0xff,
-0xaa,0x55,0x02,0x00,0x47,0x45,0x83,0x46,0xaa,0x55,0x51,0x01,0x83,0x46,0x03,0x12,
-0x00,0x01,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x36,0x00,0x52,0x09,0x00,0x00,0x0a,
-0x00,0x01,0x00,0x01,0x09,0x00,0x01,0x35,0x03,0x19,0x12,0x00,0x09,0x00,0x04,0x35,
-0x0d,0x35,0x06,0x19,0x01,0x00,0x09,0x00,0x01,0x35,0x03,0x19,0x00,0x01,0x09,0x00,
-0x09,0x35,0x08,0x35,0x06,0x19,0x12,0x00,0x09,0x01,0x00,0x09,0x02,0x00,0x09,0x01,
-0x03,0x09,0x02,0x01,0x09,0x05,0xac,0x09,0x02,0x02,0x09,0x02,0x39,0x09,0x02,0x03,
-0x09,0x06,0x44,0x09,0x02,0x04,0x28,0x01,0x09,0x02,0x05,0x09,0x00,0x02,0x03,0x11,
-0x01,0x00,0x03,0x01,0x00,0x00,0x01,0x00,0x03,0x36,0x00,0x46,0x09,0x00,0x00,0x0a,
-0x00,0x01,0x00,0x03,0x09,0x00,0x01,0x35,0x03,0x19,0x11,0x01,0x09,0x00,0x02,0x0a,
-0x00,0x00,0x00,0x00,0x09,0x00,0x04,0x35,0x0c,0x35,0x03,0x19,0x01,0x00,0x35,0x05,
-0x19,0x00,0x03,0x08,0x01,0x09,0x00,0x06,0x35,0x09,0x09,0x65,0x6e,0x09,0x00,0x6a,
-0x09,0x01,0x00,0x09,0x01,0x00,0x25,0x0a,0x53,0x50,0x50,0x20,0x73,0x6c,0x61,0x76,
-0x65,0x00,0x03,0x11,0x06,0x00,0x0f,0x01,0x00,0x00,0x01,0x00,0x07,0x36,0x00,0x8f,
-0x09,0x00,0x00,0x0a,0x00,0x01,0x00,0x07,0x09,0x00,0x01,0x35,0x03,0x19,0x11,0x16,
-0x09,0x00,0x04,0x35,0x18,0x35,0x06,0x19,0x01,0x00,0x09,0x00,0x0f,0x35,0x0e,0x19,
-0x00,0x0f,0x09,0x01,0x00,0x35,0x06,0x09,0x08,0x00,0x09,0x08,0x06,0x09,0x00,0x05,
-0x35,0x03,0x19,0x10,0x02,0x09,0x00,0x06,0x35,0x09,0x09,0x65,0x6e,0x09,0x00,0x6a,
-0x09,0x01,0x00,0x09,0x00,0x09,0x35,0x08,0x35,0x06,0x19,0x11,0x16,0x09,0x01,0x00,
-0x09,0x01,0x00,0x25,0x1d,0x41,0x6e,0x64,0x72,0x6f,0x69,0x64,0x20,0x4e,0x65,0x74,
-0x77,0x6f,0x72,0x6b,0x20,0x41,0x63,0x63,0x65,0x73,0x73,0x20,0x50,0x6f,0x69,0x6e,
-0x74,0x00,0x09,0x01,0x01,0x25,0x04,0x4e,0x41,0x50,0x00,0x09,0x03,0x0a,0x09,0x00,
-0x01,0x09,0x03,0x0b,0x09,0x00,0x05,0x09,0x03,0x0c,0x0a,0x00,0x13,0x12,0xd0,0xaa,
-0x55,0x02,0x00,0x8e,0x44,0xe8,0x0e,0xaa,0x55,0xc2,0x00,0xe8,0x0e,0x01,0x00,0x02,
-0x00,0x28,0x02,0x01,0x18,0x02,0x00,0x02,0x03,0x28,0x01,0x20,0x03,0x00,0x02,0x05,
-0x2a,0x01,0x00,0x04,0x00,0x02,0x02,0x29,0x02,0x01,0x00,0x05,0x00,0x02,0x00,0x28,
-0x02,0x00,0x18,0x06,0x00,0x02,0x03,0x28,0x01,0x4e,0x07,0x00,0x02,0x00,0x2a,0x13,
-0x41,0x73,0x74,0x20,0x4c,0x45,0x20,0x4d,0x6f,0x75,0x73,0x65,0x20,0x20,0x20,0x20,
-0x20,0x20,0x20,0x08,0x00,0x02,0x03,0x28,0x01,0x4e,0x09,0x00,0x02,0x01,0x2a,0x02,
-0x00,0x00,0x0a,0x00,0x02,0x03,0x28,0x01,0x02,0x0b,0x00,0x02,0x04,0x2a,0x08,0x10,
-0x00,0x20,0x00,0x05,0x00,0x2c,0x01,0x0c,0x00,0x02,0x00,0x28,0x10,0x55,0xe4,0x05,
-0xd2,0xaf,0x9f,0xa9,0x8f,0xe5,0x4a,0x7d,0xfe,0x43,0x53,0x53,0x49,0x0d,0x00,0x02,
-0x03,0x28,0x01,0x10,0x0e,0x00,0x10,0x16,0x96,0x24,0x47,0xc6,0x23,0x61,0xba,0xd9,
-0x4b,0x4d,0x1e,0x43,0x53,0x53,0x49,0x01,0x00,0x0f,0x00,0x02,0x02,0x29,0x02,0x00,
-0x00,0x10,0x00,0x02,0x03,0x28,0x01,0x0c,0x11,0x00,0x10,0xb3,0x9b,0x72,0x34,0xbe,
-0xec,0xd4,0xa8,0xf4,0x43,0x41,0x88,0x43,0x53,0x53,0x49,0x01,0x00,0x00,0x00,0xaa,
-0x55,0x28,0x00,0x9d,0x48,0x04,0xff,0xff,0xff,0xff,0xff,0xff,0x08,0x00,0x45,0x10,
-0x01,0x58,0x00,0x00,0x40,0x00,0x40,0x11,0x39,0x86,0x00,0x00,0x00,0x00,0xff,0xff,
-0xff,0xff,0x00,0x44,0x00,0x43,0x01,0x44,0x2a,0xa6,0x01,0x01,0x06,0xaa,0x55,0x04,
-0x00,0xaa,0x0f,0x63,0x82,0x53,0x63,0xaa,0x55,0x04,0x00,0xc6,0x48,0x64,0xf0,0x25,
-0x83,0xaa,0x55,0x01,0x00,0x3d,0x49,0x60,0xaa,0x55,0x02,0x00,0x3f,0x49,0x70,0x00,
-0xaa,0x55,0x4b,0x00,0xae,0x0f,0x35,0x01,0x01,0x39,0x02,0x05,0xdc,0x3c,0x12,0x59,
-0x49,0x43,0x48,0x49,0x50,0x3a,0x61,0x6e,0x64,0x72,0x6f,0x69,0x64,0x3a,0x56,0x54,
-0x52,0x0c,0x15,0x59,0x69,0x63,0x68,0x69,0x70,0x20,0x79,0x63,0x31,0x30,0x32,0x31,
-0x73,0x20,0x6d,0x6f,0x64,0x75,0x6c,0x65,0x37,0x0a,0x01,0x03,0x06,0x0f,0x1a,0x1c,
-0x33,0x3a,0x3b,0x2b,0x32,0x04,0x00,0x00,0x00,0x00,0x36,0x04,0x00,0x00,0x00,0x00,
-0xff,0xaa,0x55,0x0e,0x00,0xcf,0x48,0x03,0x77,0x77,0x77,0x04,0x34,0x33,0x39,0x39,
-0x03,0x63,0x6f,0x6d,0x00,0xaa,0x55,0x02,0x00,0x8f,0x48,0x1e,0x0b,0xaa,0x55,0x01,
-0x00,0xef,0x00,0x01,0xaa,0x55,0x09,0x00,0x99,0x49,0x08,0x06,0x00,0x01,0x08,0x00,
-0x06,0x04,0x00,0xaa,0x55,0x2f,0x00,0xbe,0x49,0x01,0x00,0x02,0x04,0x04,0x00,0x0f,
-0x00,0x48,0x00,0x0a,0x00,0x01,0x00,0x05,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x01,0x01,0x02,0x11,0x16,0x11,0x15,0x0c,0x00,0x01,0x00,0x04,0x05,0x08,0x00,
-0x00,0x00,0x00,0x00,0x01,0x02,0x9b,0x06,0xaa,0x55,0x07,0x00,0x76,0x41,0x0f,0x84,
-0x30,0x0a,0x0b,0xb2,0x32,0xaa,0x55,0x02,0x00,0x57,0x41,0x8b,0x0b,0xaa,0x55,0x08,
-0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x55,0x02,0x00,0xbd,
-0x40,0x02,0x24,0xaa,0x55,0x08,0x00,0xad,0x40,0x40,0x00,0x00,0x02,0x32,0x00,0x00,
-0x02,0xaa,0x55,0x02,0x00,0xbb,0x40,0x20,0x00,0xaa,0x55,0x04,0x00,0xb7,0x40,0x20,
-0x00,0x64,0x26,0xaa,0x55,0x04,0x00,0xbf,0x40,0x80,0x04,0x00,0x10,0xaa,0x55,0x05,
-0x00,0xe2,0x44,0x08,0x0e,0x05,0x04,0x00,0xaa,0x55,0x02,0x00,0x02,0x42,0x30,0x1f,
-0xaa,0x55,0x01,0x00,0x10,0x42,0x20,0xaa,0x55,0x01,0x00,0xe0,0x41,0x01,0xaa,0x55,
-0x0f,0x00,0x80,0x48,0x4b,0xba,0x55,0xd0,0x56,0xe0,0x57,0x88,0x58,0x6c,0x59,0x10,
-0x07,0xff,0xff,0xaa,0x55,0x02,0x00,0xc3,0x40,0x80,0x48,0xe3,0x2d
+0x4b,0xf0,0x20,0x20,0x5a,0x6b,0x6f,0xe4,0x48,0x8e,0x1f,0xe0,0x8a,0x02,0x58,0x00,
+0x00,0x00,0xe7,0xe6,0x00,0x05,0x20,0x60,0x00,0x00,0x20,0x40,0x7d,0xc1,0x20,0x40,
+0x07,0xc1,0x20,0x7a,0x00,0x00,0x6f,0xe4,0x48,0x8e,0x1f,0xe0,0xa4,0x02,0xe8,0x42,
+0x00,0x12,0x18,0x40,0x84,0x01,0xe0,0x42,0x00,0x12,0xe8,0x42,0x00,0x3f,0x18,0x42,
+0x72,0x00,0x1f,0xe0,0xa4,0x04,0xef,0xe2,0x00,0x12,0x98,0x4f,0xfe,0x00,0x98,0xc0,
+0x8a,0x00,0x1a,0x22,0x0c,0x00,0x20,0x40,0x7c,0xdc,0x20,0x40,0x07,0xc5,0x1f,0xe0,
+0xff,0xff,0xe8,0x42,0x00,0x12,0x18,0x40,0x84,0x01,0x98,0x41,0x04,0x00,0xe0,0x42,
+0x00,0x12,0x20,0x20,0x7d,0xbf,0x20,0x40,0x7d,0xc1,0x20,0x40,0x07,0xbd,0x20,0x7a,
+0x00,0x00,0x6f,0xe4,0x48,0x8e,0x1f,0xe0,0xa4,0x02,0xe8,0x42,0x00,0x12,0x18,0x40,
+0x85,0xff,0xe0,0x42,0x00,0x12,0xe8,0x42,0x00,0x3f,0x18,0x42,0x72,0x00,0x1f,0xe0,
+0xa4,0x03,0xef,0xe2,0x00,0x12,0x98,0x4f,0xfe,0x00,0x98,0xc0,0x8c,0x00,0x18,0xc0,
+0x8c,0x01,0x1a,0x22,0x0a,0x00,0x20,0x20,0x07,0xa4,0x6f,0xe4,0x48,0x8e,0x1f,0xe0,
+0x8c,0x02,0xef,0xe2,0x00,0x06,0x20,0x60,0x00,0x00,0x20,0x40,0x07,0xc5,0xe8,0x42,
+0x00,0x06,0x98,0x46,0x7e,0x00,0x20,0x60,0x00,0x00,0x6f,0xe4,0x48,0x8e,0x1f,0xe0,
+0x8c,0x01,0xef,0xe2,0x00,0x06,0x20,0x60,0x00,0x00,0x18,0x00,0x2a,0x08,0x20,0x30,
+0x87,0xd9,0x70,0x89,0x55,0xd4,0x20,0x00,0x00,0x04,0x70,0x89,0x55,0xd2,0x20,0x00,
+0x00,0x04,0x70,0x89,0x55,0xd1,0x20,0x00,0x00,0x04,0x6f,0xe2,0x41,0xdf,0xc0,0x00,
+0x07,0xd8,0xc0,0x00,0x87,0xe8,0xc0,0x01,0x07,0xd8,0xc0,0x01,0x87,0xe8,0xc0,0x02,
+0x07,0xe8,0xc0,0x10,0x07,0xe8,0x70,0x89,0x56,0xe0,0x70,0x89,0x55,0xd0,0x18,0x00,
+0x2a,0x08,0x18,0x00,0x2a,0x00,0x78,0x50,0xfc,0x00,0x78,0x50,0x7c,0x00,0x78,0x2f,
+0x7c,0x00,0x70,0x89,0x02,0x00,0x70,0x89,0x01,0x00,0x70,0x89,0x00,0x00,0x70,0x89,
+0x03,0x00,0x70,0x89,0x04,0x70,0x6f,0xe2,0x89,0x06,0x79,0x20,0x7e,0x00,0x67,0xe2,
+0x89,0x06,0x20,0x60,0x00,0x00,0x70,0x89,0x56,0xc0,0x20,0x20,0x07,0xd9,0x60,0x42,
+0x00,0x17,0x20,0x40,0x49,0x2a,0x20,0x40,0x49,0x80,0x58,0x00,0x05,0x00,0x20,0x40,
+0x4a,0x8e,0x6f,0xe2,0x89,0x06,0x79,0x20,0x7e,0x00,0x67,0xe2,0x89,0x06,0x20,0x20,
+0x49,0x37,0x6f,0xe2,0x04,0xf9,0xc0,0x77,0x87,0xf6,0x20,0x20,0x69,0x56,0x6f,0xe4,
+0x04,0xfd,0x1f,0xe2,0x0c,0x00,0x20,0x40,0x69,0x84,0x6f,0xe2,0x04,0xff,0xc0,0x38,
+0x07,0xfc,0x20,0x20,0x69,0x60,0x70,0x0a,0x95,0x08,0x20,0x40,0x7b,0xab,0x20,0x40,
+0x69,0x72,0x20,0x20,0x69,0xba,0xe8,0x4a,0xaa,0x55,0x40,0x00,0x00,0x40,0x82,0x00,
+0x88,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x01,0x02,0x00,0x00,0x20,0x02,
+0x00,0x00,0x04,0x00,0x00,0x09,0x02,0x89,0x30,0x08,0x10,0x00,0x00,0x00,0x68,0x00,
+0x00,0x00,0x00,0x00,0x08,0x74,0x12,0x80,0x04,0x00,0x00,0x05,0x00,0x00,0x00,0x00,
+0x00,0x02,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x55,
+0x01,0x00,0x92,0x40,0x0a,0xaa,0x55,0x01,0x00,0x54,0x46,0x40,0xaa,0x55,0x01,0x00,
+0x06,0x42,0x13,0xaa,0x55,0x08,0x00,0x98,0x40,0xdf,0xfb,0x8f,0xf8,0x8b,0x85,0x59,
+0x83,0xaa,0x55,0x03,0x00,0x14,0x42,0xd5,0x47,0x05,0xaa,0x55,0x04,0x00,0x3d,0x45,
+0x00,0x7f,0x00,0x07,0xaa,0x55,0x03,0x00,0x2d,0x46,0x03,0x00,0x04,0xaa,0x55,0x01,
+0x00,0x2c,0x46,0x01,0xaa,0x55,0x06,0x00,0x57,0x46,0x04,0x30,0x30,0x30,0x30,0x30,
+0xaa,0x55,0x10,0x00,0xf0,0x4f,0x05,0x17,0xff,0x17,0x05,0x17,0x05,0x17,0x00,0x16,
+0x04,0x17,0x00,0x16,0x00,0x16,0xaa,0x55,0x02,0x00,0x68,0x46,0x00,0x37,0xaa,0x55,
+0x01,0x00,0x6c,0x46,0x03,0xaa,0x55,0x01,0x00,0x6f,0x46,0x07,0xaa,0x55,0x03,0x00,
+0xaa,0x40,0x0c,0x02,0x5a,0xaa,0x55,0x01,0x00,0x79,0x46,0x00,0xaa,0x55,0x01,0x00,
+0x91,0x40,0x00,0xaa,0x55,0x03,0x00,0x54,0x41,0x00,0x01,0x08,0xaa,0x55,0x01,0x00,
+0x74,0x41,0x02,0xaa,0x55,0x01,0x00,0x93,0x40,0x00,0xaa,0x55,0x01,0x00,0x6d,0x46,
+0x28,0xaa,0x55,0x06,0x00,0xa0,0x40,0x78,0xca,0xa1,0x31,0x13,0x12,0xaa,0x55,0x15,
+0x00,0xe7,0x44,0x14,0x59,0x69,0x63,0x68,0x69,0x70,0x20,0x33,0x31,0x32,0x31,0x20,
+0x4d,0x6f,0x75,0x20,0x54,0x65,0x73,0x74,0xaa,0x55,0x03,0x00,0xe4,0x41,0x20,0x00,
+0x01,0xaa,0x55,0x01,0x00,0xe8,0x41,0x00,0xaa,0x55,0x01,0x00,0x90,0x44,0x01,0xaa,
+0x55,0x01,0x00,0x5f,0x44,0x07,0xaa,0x55,0x01,0x00,0x98,0x44,0x00,0xaa,0x55,0x04,
+0x00,0x75,0x46,0x2d,0x00,0x2f,0x00,0xaa,0x55,0x01,0x00,0x40,0x43,0x00,0xaa,0x55,
+0x02,0x00,0x54,0x44,0x40,0x00,0xaa,0x55,0x01,0x00,0x6e,0x46,0x05,0xaa,0x55,0x06,
+0x00,0x72,0x44,0x21,0x22,0x01,0x33,0x02,0x3a,0xaa,0x55,0x0d,0x00,0x81,0x43,0x0c,
+0x33,0x31,0x32,0x31,0x20,0x4d,0x6f,0x75,0x20,0x42,0x6c,0x65,0xaa,0x55,0x04,0x00,
+0x41,0x43,0x03,0x02,0x01,0x06,0xaa,0x55,0x16,0x00,0x61,0x43,0x0e,0x02,0x01,0x06,
+0x11,0x09,0x59,0x69,0x63,0x68,0x69,0x70,0x20,0x31,0x30,0x32,0x31,0x73,0x20,0x4d,
+0x6f,0x75,0xaa,0x55,0x07,0x00,0x25,0x44,0x02,0x03,0x00,0x05,0x10,0x02,0x03,0xaa,
+0x55,0x08,0x00,0x68,0x44,0x08,0x00,0x10,0x00,0x00,0x00,0x2c,0x01,0xaa,0x55,0x01,
+0x00,0x78,0x44,0xb9,0xaa,0x55,0x01,0x00,0x7a,0x44,0x17,0xaa,0x55,0x02,0x00,0xcc,
+0x44,0x31,0x00,0xaa,0x55,0x01,0x00,0xd1,0x40,0x01,0xaa,0x55,0x0c,0x00,0x49,0x45,
+0x05,0x03,0x00,0x12,0x00,0x01,0x01,0x00,0x01,0x11,0x03,0x00,0xaa,0x55,0x12,0x00,
+0x5f,0x45,0x01,0x07,0x00,0x00,0x00,0x00,0xde,0xca,0xfa,0xde,0xde,0xca,0xde,0xaf,
+0xde,0xca,0xca,0xff,0xaa,0x55,0x02,0x00,0x47,0x45,0x83,0x46,0xaa,0x55,0x51,0x01,
+0x83,0x46,0x03,0x12,0x00,0x01,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x36,0x00,0x52,
+0x09,0x00,0x00,0x0a,0x00,0x01,0x00,0x01,0x09,0x00,0x01,0x35,0x03,0x19,0x12,0x00,
+0x09,0x00,0x04,0x35,0x0d,0x35,0x06,0x19,0x01,0x00,0x09,0x00,0x01,0x35,0x03,0x19,
+0x00,0x01,0x09,0x00,0x09,0x35,0x08,0x35,0x06,0x19,0x12,0x00,0x09,0x01,0x00,0x09,
+0x02,0x00,0x09,0x01,0x03,0x09,0x02,0x01,0x09,0x05,0xac,0x09,0x02,0x02,0x09,0x02,
+0x39,0x09,0x02,0x03,0x09,0x06,0x44,0x09,0x02,0x04,0x28,0x01,0x09,0x02,0x05,0x09,
+0x00,0x02,0x03,0x11,0x01,0x00,0x03,0x01,0x00,0x00,0x01,0x00,0x03,0x36,0x00,0x46,
+0x09,0x00,0x00,0x0a,0x00,0x01,0x00,0x03,0x09,0x00,0x01,0x35,0x03,0x19,0x11,0x01,
+0x09,0x00,0x02,0x0a,0x00,0x00,0x00,0x00,0x09,0x00,0x04,0x35,0x0c,0x35,0x03,0x19,
+0x01,0x00,0x35,0x05,0x19,0x00,0x03,0x08,0x01,0x09,0x00,0x06,0x35,0x09,0x09,0x65,
+0x6e,0x09,0x00,0x6a,0x09,0x01,0x00,0x09,0x01,0x00,0x25,0x0a,0x53,0x50,0x50,0x20,
+0x73,0x6c,0x61,0x76,0x65,0x00,0x03,0x11,0x06,0x00,0x0f,0x01,0x00,0x00,0x01,0x00,
+0x07,0x36,0x00,0x8f,0x09,0x00,0x00,0x0a,0x00,0x01,0x00,0x07,0x09,0x00,0x01,0x35,
+0x03,0x19,0x11,0x16,0x09,0x00,0x04,0x35,0x18,0x35,0x06,0x19,0x01,0x00,0x09,0x00,
+0x0f,0x35,0x0e,0x19,0x00,0x0f,0x09,0x01,0x00,0x35,0x06,0x09,0x08,0x00,0x09,0x08,
+0x06,0x09,0x00,0x05,0x35,0x03,0x19,0x10,0x02,0x09,0x00,0x06,0x35,0x09,0x09,0x65,
+0x6e,0x09,0x00,0x6a,0x09,0x01,0x00,0x09,0x00,0x09,0x35,0x08,0x35,0x06,0x19,0x11,
+0x16,0x09,0x01,0x00,0x09,0x01,0x00,0x25,0x1d,0x41,0x6e,0x64,0x72,0x6f,0x69,0x64,
+0x20,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b,0x20,0x41,0x63,0x63,0x65,0x73,0x73,0x20,
+0x50,0x6f,0x69,0x6e,0x74,0x00,0x09,0x01,0x01,0x25,0x04,0x4e,0x41,0x50,0x00,0x09,
+0x03,0x0a,0x09,0x00,0x01,0x09,0x03,0x0b,0x09,0x00,0x05,0x09,0x03,0x0c,0x0a,0x00,
+0x13,0x12,0xd0,0xaa,0x55,0x02,0x00,0x8e,0x44,0xe8,0x0e,0xaa,0x55,0xc2,0x00,0xe8,
+0x0e,0x01,0x00,0x02,0x00,0x28,0x02,0x01,0x18,0x02,0x00,0x02,0x03,0x28,0x01,0x20,
+0x03,0x00,0x02,0x05,0x2a,0x01,0x00,0x04,0x00,0x02,0x02,0x29,0x02,0x01,0x00,0x05,
+0x00,0x02,0x00,0x28,0x02,0x00,0x18,0x06,0x00,0x02,0x03,0x28,0x01,0x4e,0x07,0x00,
+0x02,0x00,0x2a,0x13,0x41,0x73,0x74,0x20,0x4c,0x45,0x20,0x4d,0x6f,0x75,0x73,0x65,
+0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x08,0x00,0x02,0x03,0x28,0x01,0x4e,0x09,0x00,
+0x02,0x01,0x2a,0x02,0x00,0x00,0x0a,0x00,0x02,0x03,0x28,0x01,0x02,0x0b,0x00,0x02,
+0x04,0x2a,0x08,0x10,0x00,0x20,0x00,0x05,0x00,0x2c,0x01,0x0c,0x00,0x02,0x00,0x28,
+0x10,0x55,0xe4,0x05,0xd2,0xaf,0x9f,0xa9,0x8f,0xe5,0x4a,0x7d,0xfe,0x43,0x53,0x53,
+0x49,0x0d,0x00,0x02,0x03,0x28,0x01,0x10,0x0e,0x00,0x10,0x16,0x96,0x24,0x47,0xc6,
+0x23,0x61,0xba,0xd9,0x4b,0x4d,0x1e,0x43,0x53,0x53,0x49,0x01,0x00,0x0f,0x00,0x02,
+0x02,0x29,0x02,0x00,0x00,0x10,0x00,0x02,0x03,0x28,0x01,0x0c,0x11,0x00,0x10,0xb3,
+0x9b,0x72,0x34,0xbe,0xec,0xd4,0xa8,0xf4,0x43,0x41,0x88,0x43,0x53,0x53,0x49,0x01,
+0x00,0x00,0x00,0xaa,0x55,0x28,0x00,0x9e,0x48,0x04,0xff,0xff,0xff,0xff,0xff,0xff,
+0x08,0x00,0x45,0x10,0x01,0x58,0x00,0x00,0x40,0x00,0x40,0x11,0x39,0x86,0x00,0x00,
+0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x44,0x00,0x43,0x01,0x44,0x2a,0xa6,0x01,0x01,
+0x06,0xaa,0x55,0x04,0x00,0xaa,0x0f,0x63,0x82,0x53,0x63,0xaa,0x55,0x04,0x00,0xc7,
+0x48,0x64,0xf0,0x25,0x83,0xaa,0x55,0x01,0x00,0x3e,0x49,0x60,0xaa,0x55,0x02,0x00,
+0x40,0x49,0x70,0x00,0xaa,0x55,0x4b,0x00,0xae,0x0f,0x35,0x01,0x01,0x39,0x02,0x05,
+0xdc,0x3c,0x12,0x59,0x49,0x43,0x48,0x49,0x50,0x3a,0x61,0x6e,0x64,0x72,0x6f,0x69,
+0x64,0x3a,0x56,0x54,0x52,0x0c,0x15,0x59,0x69,0x63,0x68,0x69,0x70,0x20,0x79,0x63,
+0x31,0x30,0x32,0x31,0x73,0x20,0x6d,0x6f,0x64,0x75,0x6c,0x65,0x37,0x0a,0x01,0x03,
+0x06,0x0f,0x1a,0x1c,0x33,0x3a,0x3b,0x2b,0x32,0x04,0x00,0x00,0x00,0x00,0x36,0x04,
+0x00,0x00,0x00,0x00,0xff,0xaa,0x55,0x0e,0x00,0xd0,0x48,0x03,0x77,0x77,0x77,0x04,
+0x34,0x33,0x39,0x39,0x03,0x63,0x6f,0x6d,0x00,0xaa,0x55,0x02,0x00,0x8e,0x48,0x1e,
+0x0b,0xaa,0x55,0x01,0x00,0xef,0x00,0x01,0xaa,0x55,0x09,0x00,0x9a,0x49,0x08,0x06,
+0x00,0x01,0x08,0x00,0x06,0x04,0x00,0xaa,0x55,0x2f,0x00,0xc0,0x49,0x01,0x00,0x02,
+0x04,0x04,0x00,0x0f,0x00,0x48,0x00,0x0a,0x00,0x01,0x00,0x05,0x00,0x06,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x11,0x16,0x11,0x15,0x0c,0x00,0x01,0x00,
+0x04,0x05,0x08,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x9b,0x06,0xaa,0x55,0x07,0x00,
+0x76,0x41,0x0f,0x84,0x30,0x0a,0x0b,0xb2,0x32,0xaa,0x55,0x02,0x00,0x57,0x41,0x8b,
+0x0b,0xaa,0x55,0x08,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,
+0x55,0x02,0x00,0xbd,0x40,0x02,0x24,0xaa,0x55,0x08,0x00,0xad,0x40,0x40,0x00,0x00,
+0x02,0x32,0x00,0x00,0x02,0xaa,0x55,0x02,0x00,0xbb,0x40,0x20,0x00,0xaa,0x55,0x04,
+0x00,0xb7,0x40,0x20,0x00,0x64,0x26,0xaa,0x55,0x04,0x00,0xbf,0x40,0x80,0x04,0x00,
+0x10,0xaa,0x55,0x05,0x00,0xe2,0x44,0x08,0x0e,0x05,0x04,0x00,0xaa,0x55,0x02,0x00,
+0x02,0x42,0x30,0x1f,0xaa,0x55,0x01,0x00,0x10,0x42,0x20,0xaa,0x55,0x01,0x00,0xe0,
+0x41,0x01,0xaa,0x55,0x0f,0x00,0x7f,0x48,0x4b,0xba,0x55,0xd0,0x56,0xe0,0x57,0x88,
+0x58,0x6c,0x59,0x10,0x07,0xff,0xff,0xaa,0x55,0x02,0x00,0xc3,0x40,0x7f,0x48,0xba,
+0xe3
 };
Index: BlueTooth/BT_BLE/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_BLE/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_BLE/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: BlueTooth/BT_BLE/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_BLE/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_BLE/prj/GCC/makefile	(working copy)
@@ -0,0 +1,234 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/bt_code \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_bt \
+             $(LIB_PATH)/sdk/yc_systick \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_timer
+
+             
+USER_OBJS = $(USER_PATH)/main 
+
+
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap  $(LIB_PATH)/sdk/libyc_qspi.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: BlueTooth/BT_BLE/prj/MDK/Objects/YC3121_keil.sct
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_BLE/prj/MDK/Objects/YC3121_keil.sct	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_BLE/prj/MDK/Objects/YC3121_keil.sct	(working copy)
@@ -0,0 +1,55 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x00000000 0x0001fff  {    ; load region size_region
+  ER_IROM1 0x00000000 0x00001fff  {  ; load address = execution address
+   startup.o (RESET, +First)
+   startup.o (|.text|,+RO)
+;   *(InRoot$$Sections)
+  }
+  ;ER_IROM2 0x4000   {
+  ;rom_main.o (+RO)
+  ;}
+  
+  ;ER_IROM3 0x100000 {
+	  ;*(InRoot$$Sections)
+  ;}
+	
+  ;ER_IROM4 0x100400   {
+  ;flash_start.o (+RO)
+  ;.ANY (+RO) 
+  ;}
+  
+  ;RW_IRAM1 0x000d0000 0x0010000  {  ; RW data
+   ;.ANY (+RW +ZI)
+  ;}
+  
+;  ARM_LIB_STACK 0xE0000 EMPTY -0x10000{}
+}
+
+;LR_IROM2 0x4000 0x4000{
+;	ER_IROM2 0x4000 {
+;	  rom_main.o (+RO)
+;	}
+;}
+
+LR_IROM3 0x1000200 0x200{
+	ER_IROM3 0x1000200 {
+	  flash_start.o (|.flash_start|,+RO)
+	}
+}
+
+LR_IROM4 0x1000400 0x1000000{
+	ER_IROM4 0x1000400 {
+;	  flash_start.o (|.flash_start|,+RO)
+	  *(InRoot$$Sections)
+	  .ANY (+RO)
+	}
+	
+	
+	 RW_IRAM2 0x00020000 0x010000  {  ; RW data
+	.ANY (+RW +ZI)
+	}
+}
+
Index: BlueTooth/BT_BLE/prj/MDK/YC3121_Keil.uvoptx
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_BLE/prj/MDK/YC3121_Keil.uvoptx	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_BLE/prj/MDK/YC3121_Keil.uvoptx	(working copy)
@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj; *.o</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+    <nMigrate>0</nMigrate>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>YC3121</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>12000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>0</RunSim>
+        <RunTarget>1</RunTarget>
+        <RunAbUc>0</RunAbUc>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\Listings\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>7</CpuCode>
+      <DebugOpt>
+        <uSim>0</uSim>
+        <uTrg>1</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>1</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>1</tRtrace>
+        <sRSysVw>1</sRSysVw>
+        <tRSysVw>1</tRSysVw>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <bEvRecOn>1</bEvRecOn>
+        <bSchkAxf>0</bSchkAxf>
+        <bTchkAxf>0</bTchkAxf>
+        <nTsel>4</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile>..\..\..\..\..\ConfigFiles\MDK\flash.ini</tIfile>
+        <pMon>Segger\JL2CM3.dll</pMon>
+      </DebugOpt>
+      <TargetDriverDllRegistry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>PWSTATINFO</Key>
+          <Name>200,50,700</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>ARMRTXEVENTFLAGS</Key>
+          <Name>-L70 -Z18 -C0 -M0 -T1</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>DLGTARM</Key>
+          <Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>ARMDBGFLAGS</Key>
+          <Name></Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>JL2CM3</Key>
+          <Name>-U4294967295 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000 -FCA000 -FN1 -FF0YC3121 -FS01000200 -FL01000000</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>UL2CM3</Key>
+          <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000)</Name>
+        </SetRegEntry>
+      </TargetDriverDllRegistry>
+      <Breakpoint/>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>0</periodic>
+        <aLwin>1</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>1</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+      <bLintAuto>0</bLintAuto>
+      <bAutoGenD>0</bAutoGenD>
+      <LntExFlags>0</LntExFlags>
+      <pMisraName></pMisraName>
+      <pszMrule></pszMrule>
+      <pSingCmds></pSingCmds>
+      <pMultCmds></pMultCmds>
+      <pMisraNamep></pMisraNamep>
+      <pszMrulep></pszMrulep>
+      <pSingCmdsp></pSingCmdsp>
+      <pMultCmdsp></pMultCmdsp>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>core</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\core\misc.c</PathWithFileName>
+      <FilenameWithoutPath>misc.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\core\system.c</PathWithFileName>
+      <FilenameWithoutPath>system.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\core\bt_code.c</PathWithFileName>
+      <FilenameWithoutPath>bt_code.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>main</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\user\main.c</PathWithFileName>
+      <FilenameWithoutPath>main.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>sdk</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_gpio.c</PathWithFileName>
+      <FilenameWithoutPath>yc_gpio.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_uart.c</PathWithFileName>
+      <FilenameWithoutPath>yc_uart.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>7</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_bt.c</PathWithFileName>
+      <FilenameWithoutPath>yc_bt.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>8</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_systick.c</PathWithFileName>
+      <FilenameWithoutPath>yc_systick.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>9</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_ipc.c</PathWithFileName>
+      <FilenameWithoutPath>yc_ipc.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>10</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_otp.c</PathWithFileName>
+      <FilenameWithoutPath>yc_otp.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>11</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_timer.c</PathWithFileName>
+      <FilenameWithoutPath>yc_timer.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>12</FileNumber>
+      <FileType>4</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_qspi.lib</PathWithFileName>
+      <FilenameWithoutPath>yc_qspi.lib</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>13</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\startup\flash_start.s</PathWithFileName>
+      <FilenameWithoutPath>flash_start.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>14</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\startup\startup.s</PathWithFileName>
+      <FilenameWithoutPath>startup.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
Index: BlueTooth/BT_BLE/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_BLE/prj/MDK/YC3121_Keil.uvprojx	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_BLE/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -0,0 +1,482 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
+
+  <SchemaVersion>2.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>YC3121</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
+      <uAC6>0</uAC6>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>ARMCM0</Device>
+          <Vendor>ARM</Vendor>
+          <PackID>ARM.CMSIS.5.5.1</PackID>
+          <PackURL>http://www.keil.com/pack/</PackURL>
+          <Cpu>IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000)</FlashDriverDll>
+          <DeviceId>0</DeviceId>
+          <RegisterFile>$$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h</RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile>$$Device:ARMCM0$Device\ARM\SVD\ARMCM0.svd</SFDFile>
+          <bCustSvd>0</bCustSvd>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\Objects\</OutputDirectory>
+          <OutputName>YC3121_Keil</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>1</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\Listings\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>1</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopB1X>0</nStopB1X>
+            <nStopB2X>0</nStopB2X>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>fromelf.exe --text -a -c --output=@L_asm.txt "!L"</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopA1X>0</nStopA1X>
+            <nStopA2X>0</nStopA2X>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+          <ComprImg>1</ComprImg>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments>  </SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments>-pCM0</SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments> </TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments>-pCM0</TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>1</RunIndependent>
+            <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+            <Capability>1</Capability>
+            <DriverSelection>4100</DriverSelection>
+          </Flash1>
+          <bUseTDR>0</bUseTDR>
+          <Flash2>Segger\JL2CM3.dll</Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4></Flash4>
+          <pFcarmOut></pFcarmOut>
+          <pFcarmGrp></pFcarmGrp>
+          <pFcArmRoot></pFcArmRoot>
+          <FcArmLst>0</FcArmLst>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>1</hadIROM>
+            <hadIRAM>1</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>8</StupSel>
+            <useUlib>1</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <nSecure>0</nSecure>
+            <RoSelD>3</RoSelD>
+            <RwSelD>3</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>1</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>0</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>1</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>0</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>1</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x20000</Size>
+              </IRAM>
+              <IROM>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x40000</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x1000000</StartAddress>
+                <Size>0x80000</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x20000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>1</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>1</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <uC99>1</uC99>
+            <uGnu>0</uGnu>
+            <useXO>0</useXO>
+            <v6Lang>1</v6Lang>
+            <v6LangP>1</v6LangP>
+            <vShortEn>1</vShortEn>
+            <vShortWch>1</vShortWch>
+            <v6Lto>0</v6Lto>
+            <v6WtE>0</v6WtE>
+            <v6Rtti>0</v6Rtti>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>__USEKEILCOMPILE__</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\..\Librarier\sdk;..\..\..\..\..\Librarier\core;..\..\user</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <useXO>0</useXO>
+            <uClangAs>0</uClangAs>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>0</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0xd0000</DataAddressRange>
+            <pXoBase></pXoBase>
+            <ScatterFile>.\Objects\YC3121_keil.sct</ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>core</GroupName>
+          <Files>
+            <File>
+              <FileName>misc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\core\misc.c</FilePath>
+            </File>
+            <File>
+              <FileName>system.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\core\system.c</FilePath>
+            </File>
+            <File>
+              <FileName>bt_code.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\core\bt_code.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>main</GroupName>
+          <Files>
+            <File>
+              <FileName>main.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\user\main.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>sdk</GroupName>
+          <Files>
+            <File>
+              <FileName>yc_gpio.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_gpio.c</FilePath>
+            </File>
+            <File>
+              <FileName>yc_uart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_uart.c</FilePath>
+            </File>
+            <File>
+              <FileName>yc_bt.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_bt.c</FilePath>
+            </File>
+            <File>
+              <FileName>yc_systick.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_systick.c</FilePath>
+            </File>
+            <File>
+              <FileName>yc_ipc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_ipc.c</FilePath>
+            </File>
+            <File>
+              <FileName>yc_otp.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_otp.c</FilePath>
+            </File>
+            <File>
+              <FileName>yc_timer.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_timer.c</FilePath>
+            </File>
+            <File>
+              <FileName>yc_qspi.lib</FileName>
+              <FileType>4</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_qspi.lib</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>startup</GroupName>
+          <Files>
+            <File>
+              <FileName>flash_start.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\..\Librarier\startup\flash_start.s</FilePath>
+            </File>
+            <File>
+              <FileName>startup.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\..\Librarier\startup\startup.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+  <RTE>
+    <apis/>
+    <components/>
+    <files/>
+  </RTE>
+
+</Project>
Index: BlueTooth/BT_BLE/user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_BLE/user/main.c	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_BLE/user/main.c	(working copy)
@@ -0,0 +1,507 @@
+/**
+  ******************************************************************************
+  * @file    3121Demo\ModuleDemo\BlueTooth\BT&BLE\user\main.c
+  * @author  Yichip Application Team
+  * @version V1.0.0
+  * @date    18-Feb-2020
+  * @brief   BT&BLE test program.
+  ******************************************************************************
+  * @attention
+  *
+  * COPYRIGHT 2019 Yichip Microelectronics
+  *
+  * The purpose of this firmware is to provide guidance to customers engaged in 
+	* programming work to guide them smoothly to product development, 
+	* so as to save their time.
+	*
+	* Therefore, Yichip microelectronics shall not be responsible for any direct, 
+	* indirect or consequential damages caused by any content of this gu jiang 
+	* and/or contained in this code used by the customer in its products.
+  *
+  ******************************************************************************
+  */
+
+/* Includes ------------------------------------------------------------------*/
+#include "yc3121.h"
+#include "yc_gpio.h"
+#include "yc_uart.h"
+#include "yc_bt.h"
+#include "yc_systick.h"
+#include "yc_qspi.h"
+#include "yc_ipc.h"
+#include "board_config.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+#define IPC_UART UART0
+//#define UART_TO_IPC
+
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+void UART_Configuration(void);
+
+
+
+// byte0： uuid length
+//byte1-16: uuid
+// 49535343-FE78-4AE5-8FA9-9FAFD205E455
+uint8_t ble_service_uuid_lsps[] = {0x10,0x55,0xe4,0x05,0xd2,0xaf,0x9f,0xa9,0x8f,0xe5,0x4a,0x7d,0xfe,0x43,0x53,0x53,0x49};
+
+/*
+byte0: characterisitic  
+byte1:characterisitic uuid length  
+byte2-17:characterisitic uuid 
+byte18:write/read payload length 
+byte19-20:write/read payload
+*/
+//49535343-1E4D-4BD9-BA61-23C647249616
+uint8_t ble_Characteristic_uuid_lsps_tx[] = {0x10,0x10,0x16,0x96,0x24,0x47,0xc6,0x23,0x61,0xba,0xd9,0x4b,0x4d,0x1e,0x43,0x53,0x53,0x49,0x01,0x00};
+//49535343-8841-43F4-A8D4-ECBE34729BB3
+uint8_t ble_Characteristic_uuid_lsps_rx[] = {0x0c,0x10,0xb3,0x9b,0x72,0x34,0xbe,0xec,0xd4,0xa8,0xf4,0x43,0x41,0x88,0x43,0x53,0x53,0x49,0x01,0x00};
+//49535343-aca3-481c-91ec-d85e28a60318
+uint8_t ble_Characteristic_uuid_flow_ctrl[] = {0x18,0x10,0x18,0x03,0xa6,0x28,0x5e,0xd8,0xec,0x91,0x1c,0x48,0xa3,0xac,0x43,0x53,0x53,0x49,0x01,0x00};	
+
+	
+#define IFLASH_NVRAM_ADDR 0x1000000+((512-4)*1024)
+#define NVRAM_LEN 170//Nvram 长度170bytes,每组Nvram长度为34bytes,最多可存储5组配对信息
+//#define SPP_FLOWCONTROL
+uint16_t ble_send_handle=0x2a;
+uint8_t bt_cod[3] = {0x24,0x04,0x04};
+uint8_t NvramData[NVRAM_LEN]={0};
+
+	
+//write flash 
+uint8_t   ReserveNV(uint8_t* nvram);
+extern tick SystickCount;
+#ifdef UART_TO_IPC
+HCI_TypeDef HCI_Tx;
+HCI_TypeDef HCI_Rx;
+uint8_t ipc_tx_buf[256];
+uint8_t ipc_rx_buf[256];
+#endif
+
+void BT_IRQHandler()
+{
+	while(IPC_have_data())
+	{
+		#ifdef UART_TO_IPC
+		if(TRUE==IPC_ReadBtData(&HCI_Rx))
+		{
+			UART_SendBuf(IPC_UART,(uint8_t*)&HCI_Rx,3);
+			UART_SendBuf(IPC_UART,HCI_Rx.p_data,HCI_Rx.DataLen);
+		}
+		#else
+		BT_ParseBTData();
+		#endif
+	}
+
+	BT_CONFIG &= (~(1<<BT_INIT_FLAG));
+}
+
+void SYSTICK_IRQHandler()
+{
+	SystickCount++;
+	if(SystickCount>=TICK_MAX_VALUE)	SystickCount=0;
+}
+
+
+
+static uint8_t hex_lookup[16] = { '0', '1', '2', '3', '4', '5', '6', '7','8','9', 'a', 'b', 'c', 'd', 'e', 'f' };
+static void array2hex(uint8_t* in, int inlen, uint8_t* out)
+{
+	int i;
+	for (i = 0; i < inlen; ++i)
+	{
+		out[2 * i] = hex_lookup[in[i] >> 4];
+		out[2 * i + 1] = hex_lookup[in[i] & 0x0f];
+	}
+}
+
+
+/**
+  * @brief  Main program
+  * @param  None
+  * @retval None
+  */
+int main(void)
+{
+	uint8_t bt_name[15] = "YC3121bt";
+	uint8_t bt_addr[6] =  {0x00,0x00,0x00,0x33,0x22,0x10};
+	uint8_t chip_id[6]={0};
+	uint16_t temp_handle;
+
+	int UARTCMD = 0;
+	uint8_t getbtstatus = 0;
+	int i = 0;
+	#ifdef UART_TO_IPC
+	HCI_Tx.p_data=ipc_tx_buf;
+	HCI_Rx.p_data=ipc_rx_buf;
+	#endif
+	UART_Configuration();
+	MyPrintf("bt ble demo\n");
+	SysTick_Config(CPU_MHZ/100);
+	BT_Init();
+	enable_intr(INTR_BT);
+	
+	read_chipid(chip_id);
+	array2hex(chip_id,3,bt_name+8);
+	bt_name[14]='\0';
+	memcpy(bt_addr,chip_id,3);
+
+	#ifndef UART_TO_IPC
+	if(BT_SetBleName(bt_name,sizeof(bt_name)-1)==TRUE) 
+		MyPrintf("SetBleName_suc ble name:%s\n",bt_name);
+	else 
+		MyPrintf("SetBleName_failed\n");
+	
+	if(BT_SetBtName(bt_name,sizeof(bt_name)-1) == TRUE)//bt与ble名字地址可以设置成一样
+		MyPrintf("SetbtName_suc\n");
+	else 
+		MyPrintf("SetbtName_fail\n");
+	
+	if(BT_SetBleAddr(bt_addr) == TRUE) 
+		MyPrintf("SetBleAddr_suc\n");
+	else 
+		MyPrintf("SetBleAddr_fail\n"); 
+	
+	if(BT_SetBtAddr(bt_addr) == TRUE)
+		MyPrintf("SetBtAddr_suc\n");
+	else 
+		MyPrintf("SetBtAddr_fail\n");
+	
+	if(BT_SetParingMode(0x03) == TRUE)//设置配对模式为confirmkey
+		MyPrintf("set confirmkey mode success\n");
+	else
+		MyPrintf("set confirmkey mode failed\n");
+	
+	if(BT_SetCOD(bt_cod) == TRUE) //设置COD
+		MyPrintf("set COD sucess\n");
+	else
+		MyPrintf("set COD failed\n");
+
+	
+	if(BT_DeleteService() == TRUE) //  删除用户自定义服务
+		MyPrintf("delete service sucess\n");
+	else
+		MyPrintf("delete service failed\n");
+
+	temp_handle=BT_AddBleService(ble_service_uuid_lsps,sizeof(ble_service_uuid_lsps));
+	if( temp_handle!= 0)  //增加服务 返回handle无需保存
+		MyPrintf("add service sucess,handle=%04x\n",temp_handle);
+	else
+		MyPrintf("add service failed,return=%04x\n",temp_handle);
+	
+	ble_send_handle=BT_AddBleCharacteristic(ble_Characteristic_uuid_lsps_tx,sizeof(ble_Characteristic_uuid_lsps_tx));
+	if( ble_send_handle!= 0)  //增加服务特征  write返回的handle需要保存，发数据使用
+		MyPrintf("add Characteristic tx sucess,handle=%04x\n",ble_send_handle);
+	else
+		MyPrintf("add Characteristic tx failed,return=%04x\n",ble_send_handle);
+	
+	temp_handle=BT_AddBleCharacteristic(ble_Characteristic_uuid_lsps_rx,sizeof(ble_Characteristic_uuid_lsps_rx));
+	if( temp_handle!= 0)
+		MyPrintf("add Characteristic rx sucess;handle=%04x\n",temp_handle);
+	else
+		MyPrintf("add Characteristic rx failed,return=%04x\n",temp_handle);
+	
+	temp_handle=BT_AddBleCharacteristic(ble_Characteristic_uuid_flow_ctrl,sizeof(ble_Characteristic_uuid_flow_ctrl));
+	if( temp_handle!= 0)
+		MyPrintf("add Characteristic flow_ctrl sucess;handle=%04x\n",temp_handle);
+	else
+		MyPrintf("add Characteristic flow_ctrl failed,return=%04x\n",temp_handle);
+
+	if(BT_SetVisibility(0x01,0x01,0x01) == TRUE)  //设置可发现
+		MyPrintf("SetVisibility sucess\n");
+	else
+		MyPrintf("SetVisibility failed\n");
+	
+	MyPrintf("bt version=%x\n",BT_GetVersion());
+	
+	qspi_flash_read(IFLASH_NVRAM_ADDR,NvramData,NVRAM_LEN);
+	if(NvramData[34*0] > 0x05||NvramData[34*1] > 0x05||NvramData[34*2] > 0x05||NvramData[34*3] > 0x05||NvramData[34*4] > 0x05)
+	{
+		memset(NvramData,0x00,NVRAM_LEN);
+	}
+	i=0;
+	if(BT_SetNVRAM(NvramData,NVRAM_LEN) == TRUE)
+	{
+		MyPrintf("set nvram success:\n");
+		while(i<NVRAM_LEN)
+			MyPrintf("0x%02X ",NvramData[i++]);
+		MyPrintf("\n");
+	}
+	else
+		MyPrintf("set nvram failed\n");
+		#endif
+
+	while (1)
+	{
+		//uart cmd to ipc
+		#ifdef UART_TO_IPC
+		if(UART_IsRXFIFONotEmpty(IPC_UART))
+		{
+			HCI_Tx.type = UART_ReceiveData(IPC_UART);
+			while(!UART_IsRXFIFONotEmpty(IPC_UART));
+			HCI_Tx.opcode = UART_ReceiveData(IPC_UART);
+			while(!UART_IsRXFIFONotEmpty(IPC_UART));
+			HCI_Tx.DataLen = UART_ReceiveData(IPC_UART);
+			i=0;
+			while(i<HCI_Tx.DataLen)
+			{
+				while(!UART_IsRXFIFONotEmpty(IPC_UART));
+				HCI_Tx.p_data[i++] = UART_ReceiveData(IPC_UART);
+			}
+			IPC_TxData(&HCI_Tx);
+		}
+		#else
+		BT_Progress();
+		#endif
+	}
+}
+
+/**
+  * @brief  Serial port 0 initialization function.
+  * @param  None
+  * @retval None
+  */
+void UART_Configuration(void)
+{
+	UART_InitTypeDef UART_InitStruct;
+
+	/* Configure serial ports 0 RX and TX for IO. */
+	GPIO_Config(UART0_TX_PORT, UART0_TX_PIN, UART0_TXD);
+	GPIO_Config(UART0_RX_PORT, UART0_RX_PIN, UART0_RXD);
+
+	/* USARTx configured as follow:
+  - BaudRate = 115200 baud  
+  - Word Length = 8 Bits
+  - Stop Bit = 1 Stop Bit
+  - Parity = No Parity
+  - Hardware flow control disabled (RTS and CTS signals)
+  - Receive and transmit enabled
+  */
+	#ifdef UART_TO_IPC
+	UART_InitStruct.BaudRate = 115200;			//Configure serial port baud rate, the baud rate defaults to 128000.
+	#else
+	UART_InitStruct.BaudRate = UARTBAUD;
+	#endif
+	UART_InitStruct.DataBits = Databits_8b;
+	UART_InitStruct.StopBits = StopBits_1;
+	UART_InitStruct.Parity = Parity_None;
+	UART_InitStruct.FlowCtrl = FlowCtrl_None;
+	UART_InitStruct.Mode = Mode_duplex;
+	
+	UART_Init(UART0, &UART_InitStruct);
+}
+
+
+/**
+  * @brief  deal with data from bt core event 
+  * @param  None
+  * @retval None
+  */
+
+
+void BT_Progress()
+{	
+	int eventCmd= BT_GetEventOpcode();
+	switch(eventCmd)
+	{	
+		case BT_DATA:
+			{
+				uint8_t i = 0;
+				uint8_t btData[MAX_BLUETOOTH_DATA_LEN];
+				int BtDataLen=0;
+				BtDataLen=BT_ReadBTData(btData);
+				if(BtDataLen>0)
+				{
+					MyPrintf("received %d bytes bt data:\n",BtDataLen);
+					for(int i=0;i<BtDataLen;i++)	MyPrintf("%02x ",btData[i]);
+					MyPrintf("\n");	
+
+					BT_SendSppData(btData,BtDataLen);
+					MyPrintf("send %d bytes bt data:\n",BtDataLen);
+					for(int i=0;i<BtDataLen;i++)	MyPrintf("%02x ",btData[i]);
+					MyPrintf("\n");	
+					#ifdef SPP_FLOWCONTROL
+					if(BT_SetSppFlowcontrol(1) != TRUE)	MyPrintf("set Flowcontrol failed\n");
+					#endif
+				}
+				else	MyPrintf("read bt data error\r\n");
+			}
+		break;
+			
+		case BLE_DATA:
+			{
+				uint8_t bleData[MAX_BLUETOOTH_DATA_LEN]={0};
+				int BleDataLen=0;
+				BleDataLen=BT_ReadBTData(bleData+2);
+				if(BleDataLen>0)
+				{
+					MyPrintf("received %d bytes ble data:\n",BleDataLen);
+					for(int i=0;i<BleDataLen;i++)	MyPrintf("%02x ",bleData[2+i]);
+					MyPrintf("\n");
+					
+					//add handle
+					bleData[0]=(ble_send_handle&0xff);
+					bleData[1]=((ble_send_handle>>8)&0xff);
+					BT_SendBleData(bleData,BleDataLen+2);
+					MyPrintf("send %d bytes ble data[%02x %02x]:\n",BleDataLen,bleData[0],bleData[1]);
+					for(int i=0;i<BleDataLen;i++)	MyPrintf("%02x ",bleData[2+i]);
+					MyPrintf("\n");
+				}
+				else	MyPrintf("read ble data error\r\n");
+			}
+		break;
+
+		case BT_CONNECTED:
+			MyPrintf("bt connected\n");
+		break;
+			
+		case BLE_CONNECTED:
+			MyPrintf("ble connected\n");
+		break;
+			
+		case BT_DISCONNECTED:
+			MyPrintf("bt disconnected\n");
+		break;
+			
+		case BLE_DISCONNECTED:
+			MyPrintf("ble disconnected\n");
+		break;
+
+		case NVRAM_DATA:
+			{
+				uint8_t NvramData[MAX_BLUETOOTH_DATA_LEN];
+				int NvramDataLen=0;
+				NvramDataLen=BT_ReadBTData(NvramData);
+				if(NvramDataLen>0)
+				{
+					MyPrintf("receive %dbytes Nvramdata:",NvramDataLen);
+					for(int i=0;i<NvramDataLen;i++)
+					{
+						MyPrintf("%02X ",NvramData[i]);
+					}
+					MyPrintf("\n");
+					ReserveNV(NvramData);//将最新的5个设备信息（NVRAM） 写入flash ,
+				}
+				else	
+					MyPrintf("read Nvram data error\r\n");
+			}
+		break;
+
+		case CONFIRM_GKEY:
+			{
+				uint8_t GkeyData[MAX_BLUETOOTH_DATA_LEN];
+				int GkeyDataLen=0;
+				GkeyDataLen=BT_ReadBTData(GkeyData);
+				if(GkeyDataLen>0)
+				{
+					MyPrintf("receive %dbytes CONFIRM_GKEY:",GkeyDataLen);
+					for(int i=0;i<GkeyDataLen;i++)
+					{
+						MyPrintf("%02X ",GkeyData[i]);
+					}
+					MyPrintf("\n");
+				}
+				else	MyPrintf("read CONFIRM_GKEY data error\r\n");
+			
+				if(BT_ConfirmGkey(0) == TRUE)//BT_ConfirmGkey参数为0则继续配对，1则取消配对。
+					MyPrintf("set confirmkey  success");
+				else
+					MyPrintf("set confirmkey  failed\n");
+		}
+		break;
+
+		case PASSKEY:
+			MyPrintf("request Passkey");
+		break;
+
+		case PAIRING_COMPLETED:
+			{
+				uint8_t PairingData[MAX_BLUETOOTH_DATA_LEN];
+				int PairingDataLen=0;
+				PairingDataLen=BT_ReadBTData(PairingData);
+				if(PairingDataLen>0)
+				{
+					MyPrintf("receive %dbytes paring data:",PairingDataLen);
+					for(int i=0;i<PairingDataLen;i++)
+					{
+						MyPrintf("%02X ",PairingData[i]);
+					}
+					MyPrintf("\n");
+				}
+				else	MyPrintf("read PAIRING_COMPLETED data error\r\n");
+			}
+		break;
+			
+		case PAIRING_STATE:
+			{
+				uint8_t PairingData[MAX_BLUETOOTH_DATA_LEN];
+				int PairingDataLen=0;
+				uint16_t pairing_status=0;
+				PairingDataLen=BT_ReadBTData(PairingData);
+				if(PairingDataLen==2)
+				{
+					pairing_status |=PairingData[0];
+					pairing_status |=(PairingData[1]<<8);
+					switch(pairing_status)
+					{
+						case 0x0001:
+							MyPrintf("BT Pairing Success\r\n");
+						break;
+						
+						case 0x0101:
+							MyPrintf("BT Pairing fail\r\n");
+						break;
+						
+						case 0x0080:
+							MyPrintf("BLE Pairing Success\r\n");
+						break;
+						
+						case 0x0180:
+							MyPrintf("BLE Pairing fail\r\n");
+						break;
+						
+						default:
+							MyPrintf("unknown pairing_status[%04x]\r\n",pairing_status);
+						break;
+					}
+				}
+				else	MyPrintf("read PAIRING_STATE data error\r\n");
+			}
+		break;
+			
+		case -1:
+			//no event
+		break;
+			
+		default:
+		{
+			MyPrintf("unknown event:%02x\r\n",eventCmd);
+			uint8_t unknownData[MAX_BLUETOOTH_DATA_LEN];
+			int unknownDataLen=0;
+			unknownDataLen=BT_ReadBTData(unknownData);
+			if(unknownDataLen>0)
+			{
+				MyPrintf("datalen:%d\r\n",unknownDataLen);
+				for(int i=0;i<unknownDataLen;i++)
+				{
+					MyPrintf("%02X ",unknownData[i]);
+				}
+				MyPrintf("\n");
+			}
+		}
+		break;
+	}
+}
+
+uint8_t   ReserveNV(uint8_t* nvram)
+{
+	MyPrintf("new nvram data,updata to flash\r\n");
+	qspi_flash_sectorerase(IFLASH_NVRAM_ADDR);
+	return qspi_flash_write(IFLASH_NVRAM_ADDR,nvram,NVRAM_LEN);
+}
+
+/************************ (C) COPYRIGHT Yichip Microelectronics *****END OF FILE****/
+
Index: BlueTooth/DTM/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/DTM/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/DTM/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: BlueTooth/DTM/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/DTM/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/DTM/prj/GCC/makefile	(working copy)
@@ -0,0 +1,233 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/bt_code \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_DTM \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_timer 
+
+             
+USER_OBJS = $(USER_PATH)/main 
+
+
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(USER_PATH)
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: BlueTooth/DTM/prj/MDK/YC3121_Keil.uvoptx
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/DTM/prj/MDK/YC3121_Keil.uvoptx	(revision 731)
+++ /YC3121_demo/ModuleDemo/BlueTooth/DTM/prj/MDK/YC3121_Keil.uvoptx	(working copy)
@@ -224,6 +224,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\core\bt_code.c</PathWithFileName>
+      <FilenameWithoutPath>bt_code.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -234,7 +246,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>3</FileNumber>
+      <FileNumber>4</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -254,7 +266,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>4</FileNumber>
+      <FileNumber>5</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -266,7 +278,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>5</FileNumber>
+      <FileNumber>6</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -278,7 +290,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>6</FileNumber>
+      <FileNumber>7</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -290,7 +302,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>7</FileNumber>
+      <FileNumber>8</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -302,7 +314,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>8</FileNumber>
+      <FileNumber>9</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -322,7 +334,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>9</FileNumber>
+      <FileNumber>10</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -334,7 +346,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>10</FileNumber>
+      <FileNumber>11</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
Index: BlueTooth/DTM/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/DTM/prj/MDK/YC3121_Keil.uvprojx	(revision 731)
+++ /YC3121_demo/ModuleDemo/BlueTooth/DTM/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -184,6 +184,7 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
@@ -391,6 +392,11 @@
               <FileType>1</FileType>
               <FilePath>..\..\..\..\..\Librarier\core\system.c</FilePath>
             </File>
+            <File>
+              <FileName>bt_code.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\core\bt_code.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
Index: CryptTest/AES_TEST/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/AES_TEST/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/AES_TEST/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: CryptTest/AES_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/AES_TEST/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/AES_TEST/prj/GCC/makefile	(working copy)
@@ -0,0 +1,230 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_rand \
+             $(LIB_PATH)/sdk/yc_trng 
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_crypt
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_crypt/libyc_crypt.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: CryptTest/DES_TEST/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/DES_TEST/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/DES_TEST/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: CryptTest/DES_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/DES_TEST/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/DES_TEST/prj/GCC/makefile	(working copy)
@@ -0,0 +1,230 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_rand \
+             $(LIB_PATH)/sdk/yc_trng 
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_crypt
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_crypt/libyc_crypt.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: CryptTest/DES_TEST/user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/DES_TEST/user/main.c	(revision 723)
+++ /YC3121_demo/ModuleDemo/CryptTest/DES_TEST/user/main.c	(working copy)
@@ -144,8 +144,13 @@
         DES_Dec(modes[m], xPlain[1], sizeof(xPlain[1]), xCrypt, sizeof(xCrypt), KEY, NULL, &RAND_RandP, NULL);
 
         if (!memcmp(xPlain[1], xPlain[0], sizeof(cipher)))
-            sprintf(s, "DES %d %s Test\n", sizeof(xPlain[0]), cmodes[m]);
-        MyPrintf("%2x, %s", t, s);
+        {
+            MyPrintf("%2x, TDES %d %s Test\n", t, sizeof(xPlain[0]), cmodes[m]);
+        }
+        else
+        {
+            MyPrintf("%2x, %s", t, s);
+        }
     }
 }
 
@@ -212,8 +217,13 @@
         TDES_Dec(modes[m], xPlain[1], sizeof(xPlain[1]), xCrypt, sizeof(xCrypt), &KEY, NULL, &RAND_RandP, NULL);
 
         if (!memcmp(xPlain[1], xPlain[0], sizeof(cipher)))
-            sprintf(s, "TDES %d %s Test\n", sizeof(xPlain[0]), cmodes[m]);
-        MyPrintf("%2x, %s", t, s);
+        {
+            MyPrintf("%2x, TDES %d %s Test\n", t, sizeof(xPlain[0]), cmodes[m]);
+        }
+        else
+        {
+            MyPrintf("%2x, %s", t, s);
+        }
     }
 }
 
Index: CryptTest/RSA_GENKEY_TEST/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/RSA_GENKEY_TEST/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/RSA_GENKEY_TEST/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: CryptTest/RSA_GENKEY_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/RSA_GENKEY_TEST/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/RSA_GENKEY_TEST/prj/GCC/makefile	(working copy)
@@ -0,0 +1,230 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_rand \
+             $(LIB_PATH)/sdk/yc_trng 
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_crypt
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_crypt/libyc_crypt.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: CryptTest/RSA_TEST/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/RSA_TEST/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/RSA_TEST/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: CryptTest/RSA_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/RSA_TEST/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/RSA_TEST/prj/GCC/makefile	(working copy)
@@ -0,0 +1,230 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_rand \
+             $(LIB_PATH)/sdk/yc_trng 
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_crypt
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_crypt/libyc_crypt.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: CryptTest/RSA_TRIPLE_TEST/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/RSA_TRIPLE_TEST/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/RSA_TRIPLE_TEST/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: CryptTest/RSA_TRIPLE_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/RSA_TRIPLE_TEST/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/RSA_TRIPLE_TEST/prj/GCC/makefile	(working copy)
@@ -0,0 +1,230 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_rand \
+             $(LIB_PATH)/sdk/yc_trng 
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_crypt
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_crypt/libyc_crypt.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: CryptTest/SHA_ENHNCE_TEST/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SHA_ENHNCE_TEST/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SHA_ENHNCE_TEST/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: CryptTest/SHA_ENHNCE_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SHA_ENHNCE_TEST/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SHA_ENHNCE_TEST/prj/GCC/makefile	(working copy)
@@ -0,0 +1,230 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_rand \
+             $(LIB_PATH)/sdk/yc_trng 
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_crypt
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_crypt/libyc_crypt.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: CryptTest/SHA_ENHNCE_TEST/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SHA_ENHNCE_TEST/prj/MDK/YC3121_Keil.uvprojx	(revision 723)
+++ /YC3121_demo/ModuleDemo/CryptTest/SHA_ENHNCE_TEST/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -184,6 +184,7 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
Index: CryptTest/SHA_ENHNCE_TEST/user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SHA_ENHNCE_TEST/user/main.c	(revision 723)
+++ /YC3121_demo/ModuleDemo/CryptTest/SHA_ENHNCE_TEST/user/main.c	(working copy)
@@ -98,7 +98,7 @@
 	const char *cc1_384 = "FBEBF75AD47A69F30729A9C2620904AFBD1BBCC237645E0CCA474AAD36320ED008FC5D9E2A2208C5FDF37F967A0BAEE9";
 	const char *cc1_512 = "4E5B77FEF46B48EFD195BB5478B82CB70F203BF5600345B9B7C00567444C029E2E85143A321C7E88C558F564B2D856FB4CFB6979F2D37A27A5531E469809AC6A";
 
-	const int inputlen = 1024 * 10;
+	#define inputlen	(1024 * 10)
 	uint32_t len = 0;
 	int i = 0;
 
Index: CryptTest/SHA_TEST/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SHA_TEST/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SHA_TEST/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: CryptTest/SHA_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SHA_TEST/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SHA_TEST/prj/GCC/makefile	(working copy)
@@ -0,0 +1,230 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_rand \
+             $(LIB_PATH)/sdk/yc_trng 
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_crypt
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_crypt/libyc_crypt.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: CryptTest/SHA_TEST/user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SHA_TEST/user/main.c	(revision 723)
+++ /YC3121_demo/ModuleDemo/CryptTest/SHA_TEST/user/main.c	(working copy)
@@ -98,7 +98,7 @@
     const char *cc1_384 = "FBEBF75AD47A69F30729A9C2620904AFBD1BBCC237645E0CCA474AAD36320ED008FC5D9E2A2208C5FDF37F967A0BAEE9";
     const char *cc1_512 = "4E5B77FEF46B48EFD195BB5478B82CB70F203BF5600345B9B7C00567444C029E2E85143A321C7E88C558F564B2D856FB4CFB6979F2D37A27A5531E469809AC6A";
 
-    const int inputlen = 1024 * 10;
+    #define inputlen        (1024 * 10)
     int i = 0;
 
     unsigned char c_512[inputlen + 1] = {0};
Index: CryptTest/SM2_ENC_DEC_TEST/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SM2_ENC_DEC_TEST/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SM2_ENC_DEC_TEST/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: CryptTest/SM2_ENC_DEC_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SM2_ENC_DEC_TEST/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SM2_ENC_DEC_TEST/prj/GCC/makefile	(working copy)
@@ -0,0 +1,230 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_rand \
+             $(LIB_PATH)/sdk/yc_trng 
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_crypt
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_crypt/libyc_crypt.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: CryptTest/SM2_ENC_DEC_TEST/prj/MDK/Objects/YC3121_keil.sct
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SM2_ENC_DEC_TEST/prj/MDK/Objects/YC3121_keil.sct	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SM2_ENC_DEC_TEST/prj/MDK/Objects/YC3121_keil.sct	(working copy)
@@ -0,0 +1,55 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x00000000 0x0001fff  {    ; load region size_region
+  ER_IROM1 0x00000000 0x00001fff  {  ; load address = execution address
+   startup.o (RESET, +First)
+   startup.o (|.text|,+RO)
+;   *(InRoot$$Sections)
+  }
+  ;ER_IROM2 0x4000   {
+  ;rom_main.o (+RO)
+  ;}
+  
+  ;ER_IROM3 0x100000 {
+	  ;*(InRoot$$Sections)
+  ;}
+	
+  ;ER_IROM4 0x100400   {
+  ;flash_start.o (+RO)
+  ;.ANY (+RO) 
+  ;}
+  
+  ;RW_IRAM1 0x000d0000 0x0010000  {  ; RW data
+   ;.ANY (+RW +ZI)
+  ;}
+  
+;  ARM_LIB_STACK 0xE0000 EMPTY -0x10000{}
+}
+
+;LR_IROM2 0x4000 0x4000{
+;	ER_IROM2 0x4000 {
+;	  rom_main.o (+RO)
+;	}
+;}
+
+LR_IROM3 0x1000200 0x200{
+	ER_IROM3 0x1000200 {
+	  flash_start.o (|.flash_start|,+RO)
+	}
+}
+
+LR_IROM4 0x1000400 0x1000000{
+	ER_IROM4 0x1000400 {
+;	  flash_start.o (|.flash_start|,+RO)
+	  *(InRoot$$Sections)
+	  .ANY (+RO)
+	}
+	
+	
+	 RW_IRAM2 0x00020000 0x010000  {  ; RW data
+	.ANY (+RW +ZI)
+	}
+}
+
Index: CryptTest/SM2_ENC_DEC_TEST/prj/MDK/YC3121_Keil.uvoptx
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SM2_ENC_DEC_TEST/prj/MDK/YC3121_Keil.uvoptx	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SM2_ENC_DEC_TEST/prj/MDK/YC3121_Keil.uvoptx	(working copy)
@@ -0,0 +1,362 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj; *.o</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+    <nMigrate>0</nMigrate>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>YC3121</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>12000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>0</RunSim>
+        <RunTarget>1</RunTarget>
+        <RunAbUc>0</RunAbUc>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\Listings\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>7</CpuCode>
+      <DebugOpt>
+        <uSim>0</uSim>
+        <uTrg>1</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>1</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>1</tRtrace>
+        <sRSysVw>1</sRSysVw>
+        <tRSysVw>1</tRSysVw>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <bEvRecOn>1</bEvRecOn>
+        <bSchkAxf>0</bSchkAxf>
+        <bTchkAxf>0</bTchkAxf>
+        <nTsel>4</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile>..\..\..\..\..\ConfigFiles\MDK\flash.ini</tIfile>
+        <pMon>Segger\JL2CM3.dll</pMon>
+      </DebugOpt>
+      <TargetDriverDllRegistry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>DLGUARM</Key>
+          <Name>d</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>PWSTATINFO</Key>
+          <Name>200,50,700</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>ARMRTXEVENTFLAGS</Key>
+          <Name>-L70 -Z18 -C0 -M0 -T1</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>DLGTARM</Key>
+          <Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>ARMDBGFLAGS</Key>
+          <Name></Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>JL2CM3</Key>
+          <Name>-U4294967295 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000 -FCA000 -FN1 -FF0YC3121 -FS01000000 -FL080000</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>UL2CM3</Key>
+          <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000)</Name>
+        </SetRegEntry>
+      </TargetDriverDllRegistry>
+      <Breakpoint/>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>0</periodic>
+        <aLwin>1</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>1</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+      <bLintAuto>0</bLintAuto>
+      <bAutoGenD>0</bAutoGenD>
+      <LntExFlags>0</LntExFlags>
+      <pMisraName></pMisraName>
+      <pszMrule></pszMrule>
+      <pSingCmds></pSingCmds>
+      <pMultCmds></pMultCmds>
+      <pMisraNamep></pMisraNamep>
+      <pszMrulep></pszMrulep>
+      <pSingCmdsp></pSingCmdsp>
+      <pMultCmdsp></pMultCmdsp>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>core</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\core\misc.c</PathWithFileName>
+      <FilenameWithoutPath>misc.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\core\system.c</PathWithFileName>
+      <FilenameWithoutPath>system.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>main</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\user\main.c</PathWithFileName>
+      <FilenameWithoutPath>main.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>sdk</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_gpio.c</PathWithFileName>
+      <FilenameWithoutPath>yc_gpio.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_uart.c</PathWithFileName>
+      <FilenameWithoutPath>yc_uart.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_rand.c</PathWithFileName>
+      <FilenameWithoutPath>yc_rand.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>7</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_trng.c</PathWithFileName>
+      <FilenameWithoutPath>yc_trng.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>8</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\startup\flash_start.s</PathWithFileName>
+      <FilenameWithoutPath>flash_start.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>9</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\startup\startup.s</PathWithFileName>
+      <FilenameWithoutPath>startup.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>crypt</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>10</FileNumber>
+      <FileType>4</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_crypt\yc_crypt.lib</PathWithFileName>
+      <FilenameWithoutPath>yc_crypt.lib</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
Index: CryptTest/SM2_ENC_DEC_TEST/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SM2_ENC_DEC_TEST/prj/MDK/YC3121_Keil.uvprojx	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SM2_ENC_DEC_TEST/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -0,0 +1,466 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
+
+  <SchemaVersion>2.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>YC3121</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
+      <uAC6>0</uAC6>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>ARMCM0</Device>
+          <Vendor>ARM</Vendor>
+          <PackID>ARM.CMSIS.5.5.1</PackID>
+          <PackURL>http://www.keil.com/pack/</PackURL>
+          <Cpu>IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000)</FlashDriverDll>
+          <DeviceId>0</DeviceId>
+          <RegisterFile>$$Device:ARMCM0$Device\ARM\ARMCM0\Include\ARMCM0.h</RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <bCustSvd>0</bCustSvd>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\Objects\</OutputDirectory>
+          <OutputName>YC3121_Keil</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>1</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\Listings\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>1</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopB1X>0</nStopB1X>
+            <nStopB2X>0</nStopB2X>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>fromelf.exe --text -a -c --output=@L_asm.txt "!L"</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopA1X>0</nStopA1X>
+            <nStopA2X>0</nStopA2X>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+          <ComprImg>1</ComprImg>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments>  </SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments>-pCM0</SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments> </TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments>-pCM0</TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>1</RunIndependent>
+            <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
+            <Capability>1</Capability>
+            <DriverSelection>4100</DriverSelection>
+          </Flash1>
+          <bUseTDR>0</bUseTDR>
+          <Flash2>Segger\JL2CM3.dll</Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4></Flash4>
+          <pFcarmOut></pFcarmOut>
+          <pFcarmGrp></pFcarmGrp>
+          <pFcArmRoot></pFcArmRoot>
+          <FcArmLst>0</FcArmLst>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>1</hadIROM>
+            <hadIRAM>1</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>8</StupSel>
+            <useUlib>1</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <nSecure>0</nSecure>
+            <RoSelD>3</RoSelD>
+            <RwSelD>3</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>0</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>1</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>0</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>1</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x20000</Size>
+              </IRAM>
+              <IROM>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x40000</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x40000</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x20000</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>2</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <uC99>1</uC99>
+            <uGnu>1</uGnu>
+            <useXO>0</useXO>
+            <v6Lang>1</v6Lang>
+            <v6LangP>1</v6LangP>
+            <vShortEn>1</vShortEn>
+            <vShortWch>1</vShortWch>
+            <v6Lto>0</v6Lto>
+            <v6WtE>0</v6WtE>
+            <v6Rtti>0</v6Rtti>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>__USEKEILCOMPILE__</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\..\Librarier\core;..\..\..\..\..\Librarier\sdk;..\..\..\..\..\Librarier\sdk\yc_crypt</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <useXO>0</useXO>
+            <uClangAs>0</uClangAs>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>0</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0xd0000</DataAddressRange>
+            <pXoBase></pXoBase>
+            <ScatterFile>.\Objects\YC3121_keil.sct</ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>core</GroupName>
+          <Files>
+            <File>
+              <FileName>misc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\core\misc.c</FilePath>
+            </File>
+            <File>
+              <FileName>system.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\core\system.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>main</GroupName>
+          <Files>
+            <File>
+              <FileName>main.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\user\main.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>sdk</GroupName>
+          <Files>
+            <File>
+              <FileName>yc_gpio.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_gpio.c</FilePath>
+            </File>
+            <File>
+              <FileName>yc_uart.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_uart.c</FilePath>
+            </File>
+            <File>
+              <FileName>yc_rand.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_rand.c</FilePath>
+            </File>
+            <File>
+              <FileName>yc_trng.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_trng.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>startup</GroupName>
+          <Files>
+            <File>
+              <FileName>flash_start.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\..\Librarier\startup\flash_start.s</FilePath>
+            </File>
+            <File>
+              <FileName>startup.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\..\Librarier\startup\startup.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>crypt</GroupName>
+          <Files>
+            <File>
+              <FileName>yc_crypt.lib</FileName>
+              <FileType>4</FileType>
+              <FilePath>..\..\..\..\..\Librarier\sdk\yc_crypt\yc_crypt.lib</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+  <RTE>
+    <apis/>
+    <components/>
+    <files/>
+  </RTE>
+
+</Project>
Index: CryptTest/SM2_ENC_DEC_TEST/user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SM2_ENC_DEC_TEST/user/main.c	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SM2_ENC_DEC_TEST/user/main.c	(working copy)
@@ -0,0 +1,256 @@
+/**
+  ******************************************************************************
+  * @file    3121Demo\ModuleDemo\CryptTest\SM2_ENC&DEC_TEST\user\main.c
+  * @author  Yichip Application Team
+  * @version V1.0.1
+  * @date    15-July-2020
+  * @brief   SM2 ENC&DEC TEST program.
+  ******************************************************************************
+  * @attention
+  *
+  * COPYRIGHT 2019 Yichip Microelectronics
+  *
+  * The purpose of this demo is to provide guidance to customers engaged in
+	* programming work to guide them smoothly to product development,
+	* so as to save their time.
+	*
+	* Therefore, Yichip microelectronics shall not be responsible for any direct,
+	* indirect or consequential damages caused by any content of this demo
+	* and/or contained in this code used by the customer in its products.
+  *
+  ******************************************************************************
+  */
+
+/* Includes ------------------------------------------------------------------*/
+#include <string.h>
+#include <stdio.h>
+#include "yc3121.h"
+#include "yc_gpio.h"
+#include "yc_uart.h"
+#include "yc_sm2.h"
+#include "yc_rand.h"
+#include "board_config.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+#define SM2_ENC 0
+#define SM2_DEC 1
+
+#define KEY_WORDS (256 + 31) / 32
+#define KEY_BYTES (256 + 7 ) / 8
+
+#define ce     "B524F552CD82B8B028476E005C377FB19A87E6FC682D48BB5D42E3D9B9EFFE76"
+#define crand  "6CB28D99385C175C94F94E934817663FC176D925DD72B727260DBAAE1FB2F96F"
+
+#define cp     "8542D69E4C044F18E8B92435BF6FF7DE457283915C45517D722EDB8B08F1DFC3"
+#define ca     "787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E498"
+#define cb     "63E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A"
+#define cGx    "421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D"
+#define cGy    "0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A2"
+#define cn     "8542D69E4C044F18E8B92435BF6FF7DD297720630485628D5AE74EE7C32E79B7"
+
+#define ckeyd  "1649AB77A00637BD5E2EFE283FBF353534AA7F7CB89463F208DDBC2920BB0DA0"
+#define cex    "435B39CCA8F3B508C1488AFC67BE491A0F7BA07E581A0E4849A5CF70628A7E0A"
+#define cey    "75DDBA78F15FEECB4C7895E2C1CDF5FE01DEBB2CDBADF45399CCF77BBA076A42"
+
+#define cENTLa "0090"
+#define cIDa   "414C494345313233405941484F4F2E434F4D"
+
+#define cm     "6D65737361676520646967657374"
+#define cZa    "F4A38489E32B45B6F876E3AC2168CA392362DC8F23459C1D1146FC3DBFB7BC9A"
+#define _cm    "F4A38489E32B45B6F876E3AC2168CA392362DC8F23459C1D1146FC3DBFB7BC9A6D65737361676520646967657374"
+
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+uint8_t test_cplain[] = {0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64};
+uint8_t _test_cplain[512];
+uint8_t test_ccipher[40 + 65 + 32];
+uint8_t  message[19];
+uint32_t mlen;
+uint8_t  cipher[116];
+uint32_t clen;
+
+/* Private function prototypes -----------------------------------------------*/
+void UART_Configuration(void);
+void sm2_enc_dec_test(void);
+void SM2_ALU(SM2_PrivateKeyTypeDef Key, uint16_t Keylen, uint8_t *Input, uint32_t InputLen, uint8_t *Output, uint32_t *OutputLen, uint8_t Mode);
+
+/*
+ * Convert an ASCII character to digit value
+ */
+static int bn_get_digit(uint32_t *d, char c)
+{
+    *d = 255;
+
+    if (c >= 0x30 && c <= 0x39) *d = c - 0x30;
+    if (c >= 0x41 && c <= 0x46) *d = c - 0x37;
+    if (c >= 0x61 && c <= 0x66) *d = c - 0x57;
+
+    if (*d >= (uint32_t) 16)
+        return (-1);
+
+    return (0);
+}
+/*
+ * Import from an ASCII string to an big endian data array
+ */
+int bn_read_string_to_bytes(uint8_t *r, uint32_t len, const char *s)
+{
+    uint32_t i, j, slen;
+    uint32_t d;
+
+    slen = strlen(s);
+
+    if ((len * 2) < slen)
+        return (-1);
+
+    memset(r, 0, len);
+
+    len = len - 1;
+
+    for (i = slen, j = 0; i > 0; i--, j++)
+    {
+        if (-1 == bn_get_digit(&d, s[i - 1]))
+            return (-1);
+        r[j / 2] |= d << ((j % 2) << 2);
+    }
+
+    return (0);
+}
+
+/**
+  * @brief  Main program
+  * @param  None
+  * @retval None
+  */
+int main(void)
+{
+    SM2_PrivateKeyTypeDef Key;
+
+    UART_Configuration();
+
+    MyPrintf("Yichip Yc3121 SM2 ENC&DEC test Demo V1.0.\r\n");
+
+    bn_read_string_to_bytes(Key.d, 	 KEY_WORDS * 4, ckeyd);
+    bn_read_string_to_bytes(Key.e.x, KEY_WORDS * 4, cex);
+    bn_read_string_to_bytes(Key.e.y, KEY_WORDS * 4, cey);
+    printv(Key.d, KEY_WORDS * 4, "d:");
+    printv(Key.e.x, KEY_WORDS * 4, "ex:");
+    printv(Key.e.y, KEY_WORDS * 4, "ey:");
+
+    MyPrintf("\n  SM2_Enc           \n");
+    SM2_ALU(Key, 256, test_cplain, sizeof(test_cplain), test_ccipher, &clen, SM2_ENC);
+    MyPrintf("\n  SM2_Dec           \n");
+    SM2_ALU(Key, 256, test_ccipher, clen, _test_cplain, &mlen, SM2_DEC);
+
+    while (1)
+    {
+
+    }
+}
+
+/**
+  * @brief  Serial port 0 initialization function.
+  * @param  None
+  * @retval None
+  */
+void UART_Configuration(void)
+{
+    UART_InitTypeDef UART_InitStruct;
+
+    /* Configure serial ports RX and TX for IO. */
+    GPIO_Config(UART0_TX_PORT, UART0_TX_PIN, UART0_TXD);
+    GPIO_Config(UART0_RX_PORT, UART0_RX_PIN, UART0_RXD);
+
+    /* USARTx configured as follow:
+    - BaudRate = 115200 baud
+    - Word Length = 8 Bits
+    - Stop Bit = 1 Stop Bit
+    - Parity = No Parity
+    - Hardware flow control disabled (RTS and CTS signals)
+    - Receive and transmit enabled
+    */
+    UART_InitStruct.BaudRate = UARTBAUD;			//Configure serial port baud rate, the baud rate defaults to 128000.
+    UART_InitStruct.DataBits = Databits_8b;
+    UART_InitStruct.StopBits = StopBits_1;
+    UART_InitStruct.Parity = Parity_None;
+    UART_InitStruct.FlowCtrl = FlowCtrl_None;
+    UART_InitStruct.Mode = Mode_duplex;
+
+    UART_Init(UART0, &UART_InitStruct);
+}
+
+void SM2_ALU(SM2_PrivateKeyTypeDef Key, uint16_t Keylen, uint8_t *Input, uint32_t InputLen, uint8_t *Output, uint32_t *OutputLen, uint8_t Mode)
+{
+    SM2_EllipseParaTypeDef para;
+    SM2_PrivateKeyTypeDef *key;
+    uint8_t config = 0;
+    uint32_t ret;
+
+    bn_read_string_to_bytes(para.p, KEY_WORDS * 4, cp);
+    bn_read_string_to_bytes(para.a, KEY_WORDS * 4, ca);
+    bn_read_string_to_bytes(para.b, KEY_WORDS * 4, cb);
+    bn_read_string_to_bytes(para.n, KEY_WORDS * 4, cn);
+    bn_read_string_to_bytes(para.g.x, KEY_WORDS * 4, cGx);
+    bn_read_string_to_bytes(para.g.y, KEY_WORDS * 4, cGy);
+
+    printv(para.p, KEY_WORDS * 4, "p:"); //数据取反
+    printv(para.a, KEY_WORDS * 4, "a:");
+    printv(para.b, KEY_WORDS * 4, "b:");
+    printv(para.n, KEY_WORDS * 4, "n:");
+    printv(para.g.x, KEY_WORDS * 4, "gx:");
+    printv(para.g.y, KEY_WORDS * 4, "gy:");
+
+    key = &Key;
+    printv(key->d, KEY_WORDS * 4, "d:");
+    printv(key->e.x, KEY_WORDS * 4, "e.x:");
+    printv(key->e.y, KEY_WORDS * 4, "e.y:");
+    switch (Keylen)
+    {
+    case 192:
+        config = ECC_P192;
+        break;
+    case 224:
+        config = ECC_P224;
+        break;
+    case 256:
+        config = ECC_P256;
+        break;
+    case 163:
+        config = ECC_B163;
+        break;
+    case 193:
+        config = ECC_B193;
+        break;
+    case 233:
+        config = ECC_B233;
+        break;
+    case 257:
+        config = ECC_B257;
+        break;
+    default:
+        config = ECC_P256;
+        break;
+    }
+
+    if (Mode == SM2_ENC)
+    {
+        ret = SM2_Enc(Output, OutputLen, Input, InputLen, &(key->e), &para, &RAND_RandP, NULL, config);
+        if (ret != RET_SM2_ENC_SUCCESS)
+            MyPrintf("  SM2_Enc:  ERROR::%c%c%c%c\n", ret, ret >> 8, ret >> 16, ret >> 24);
+        else
+            MyPrintf("  SM2_Enc:  SUCCESS	\n");
+        printv(test_ccipher, clen, "test_ccipher:");
+    }
+    else if (Mode == SM2_DEC)
+    {
+        ret = SM2_Dec(Output, OutputLen, Input, InputLen, key, &para, &RAND_RandP, NULL, config);
+        if (ret != RET_SM2_DEC_SUCCESS)
+            MyPrintf("  SM2_Dec:  ERROR::%c%c%c%c\n", ret, ret >> 8, ret >> 16, ret >> 24);
+        else
+            MyPrintf("	SM2_Dec: SUCCESS	\n");
+        printv(_test_cplain, mlen, "_test_cplain:");
+    }
+}
+
+/************************ (C) COPYRIGHT Yichip Microelectronics *****END OF FILE****/
Index: CryptTest/SM2_SIGNATURE_TEST/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SM2_SIGNATURE_TEST/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SM2_SIGNATURE_TEST/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: CryptTest/SM2_SIGNATURE_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SM2_SIGNATURE_TEST/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SM2_SIGNATURE_TEST/prj/GCC/makefile	(working copy)
@@ -0,0 +1,230 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_rand \
+             $(LIB_PATH)/sdk/yc_trng 
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_crypt
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_crypt/libyc_crypt.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: CryptTest/SM2_TEST/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SM2_TEST/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SM2_TEST/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: CryptTest/SM2_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SM2_TEST/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SM2_TEST/prj/GCC/makefile	(working copy)
@@ -0,0 +1,230 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_rand \
+             $(LIB_PATH)/sdk/yc_trng 
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_crypt
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_crypt/libyc_crypt.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: CryptTest/SM4_TEST/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SM4_TEST/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SM4_TEST/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: CryptTest/SM4_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/CryptTest/SM4_TEST/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/CryptTest/SM4_TEST/prj/GCC/makefile	(working copy)
@@ -0,0 +1,230 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_rand \
+             $(LIB_PATH)/sdk/yc_trng 
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_crypt
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_crypt/libyc_crypt.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: GPIO/GPIO_IO_Interrupt/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/GPIO/GPIO_IO_Interrupt/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/GPIO/GPIO_IO_Interrupt/prj/GCC/makefile	(working copy)
@@ -23,15 +23,10 @@
              $(LIB_PATH)/core/misc \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
-             $(LIB_PATH)/sdk/yc_exti
+             $(LIB_PATH)/sdk/yc_exti 
 
              
-             
-
-
-             
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -39,22 +34,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -65,7 +208,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: GPIO/GPIO_IO_Toggle/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/GPIO/GPIO_IO_Toggle/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/GPIO/GPIO_IO_Toggle/prj/GCC/makefile	(working copy)
@@ -21,19 +21,11 @@
 CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
              $(LIB_PATH)/core/system \
              $(LIB_PATH)/core/misc \
-             $(LIB_PATH)/sdk/yc_sysctrl \
              $(LIB_PATH)/sdk/yc_gpio \
-             $(LIB_PATH)/sdk/yc_uart 
-             
-
+             $(LIB_PATH)/sdk/yc_uart
 
              
-             
-
-
-             
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -41,22 +33,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -67,7 +207,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: ICCard/ICCard/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/ICCard/ICCard/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/ICCard/ICCard/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: ICCard/ICCard/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/ICCard/ICCard/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/ICCard/ICCard/prj/GCC/makefile	(working copy)
@@ -0,0 +1,233 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_7816/yc_7816 \
+             $(LIB_PATH)/sdk/yc_7816/yc_7816_T0 \
+             $(LIB_PATH)/sdk/yc_7816/yc_7816_T1 
+
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_7816
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: IIC/IIC_EEPROM/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/IIC/IIC_EEPROM/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/IIC/IIC_EEPROM/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: IIC/IIC_EEPROM/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/IIC/IIC_EEPROM/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/IIC/IIC_EEPROM/prj/GCC/makefile	(working copy)
@@ -0,0 +1,229 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_iic 
+
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: IIC/IIC_EEPROM/user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/IIC/IIC_EEPROM/user/main.c	(revision 723)
+++ /YC3121_demo/ModuleDemo/IIC/IIC_EEPROM/user/main.c	(working copy)
@@ -97,6 +97,7 @@
   */
 void IIC_Configuration(void)
 {
+  #if (BOARD_VER == MPOS_BOARD_V2_1)
     /* Configure the IIC bus data and clock IO. */
     GPIO_Config(IIC_SDA_PORT, IIC_SDA_PIN,  IIC_SDA);
     GPIO_Config(IIC_SCL_PORT, IIC_SCL_PIN, IIC_SCL);
@@ -111,6 +112,9 @@
     IIC_CONFIGCB->dthd = 0;
 
     IIC_Init(IIC_CONFIGCB);
+  #else
+    MyPrintf("BOARD_VER not support IIC_EEPROM test\n");
+  #endif
 }
 
 /**
@@ -120,6 +124,7 @@
   */
 void IIC_EEPROM_Test(void)
 {
+  #if (BOARD_VER == MPOS_BOARD_V2_1)
     /* AT24C02 storage capacity of 2K, 32 pages, 8 bytes per page, address length of 8 bits. */
     /* LSB 0xa0 is the control bit write operation and 0xa1 is the control bit read operation.*/
     uint8_t src_w[10] = {0xa0, 0x00, 's', 'u', 'c', 'c', 'e', 's', 's', '!'};
@@ -139,6 +144,9 @@
 
     GPIO_Config(IIC_WP2_PORT, IIC_WP2_PIN, OUTPUT_LOW);
     GPIO_Config(IIC_WP128_PORT, IIC_WP128_PIN, OUTPUT_HIGH);
+  #else
+    MyPrintf("BOARD_VER not support IIC_EEPROM test\n");
+  #endif
 }
 
 /************************ (C) COPYRIGHT Yichip Microelectronics *****END OF FILE****/
Index: IIC/IIC_EEPROM_128/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/IIC/IIC_EEPROM_128/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/IIC/IIC_EEPROM_128/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: IIC/IIC_EEPROM_128/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/IIC/IIC_EEPROM_128/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/IIC/IIC_EEPROM_128/prj/GCC/makefile	(working copy)
@@ -0,0 +1,229 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_iic 
+
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: IIC/IIC_EEPROM_128/user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/IIC/IIC_EEPROM_128/user/main.c	(revision 723)
+++ /YC3121_demo/ModuleDemo/IIC/IIC_EEPROM_128/user/main.c	(working copy)
@@ -96,6 +96,7 @@
   */
 void IIC_Configuration(void)
 {
+  #if (BOARD_VER == MPOS_BOARD_V2_1)
     /* Configure the IIC bus data and clock IO. */
     GPIO_Config(IIC_SDA_PORT, IIC_SDA_PIN,  IIC_SDA);
     GPIO_Config(IIC_SCL_PORT, IIC_SCL_PIN, IIC_SCL);
@@ -110,6 +111,9 @@
     IIC_CONFIGCB->dthd = 0;
 
     IIC_Init(IIC_CONFIGCB);
+  #else
+    MyPrintf("BOARD_VER not support IIC_EEPROM_128 test\n");
+  #endif
 }
 
 /**
@@ -119,6 +123,7 @@
   */
 void IIC_EEPROM_Test(void)
 {
+  #if (BOARD_VER == MPOS_BOARD_V2_1)
     uint16_t i, j;
     uint8_t src_w[67] = {0};
     uint8_t src_r[4] = {0};
@@ -154,6 +159,9 @@
 
     GPIO_Config(IIC_WP2_PORT, IIC_WP2_PIN, OUTPUT_HIGH);
     GPIO_Config(IIC_WP128_PORT, IIC_WP128_PIN, OUTPUT_HIGH);
+  #else
+    MyPrintf("BOARD_VER not support IIC_EEPROM_128 test\n");
+  #endif
 }
 
 /************************ (C) COPYRIGHT Yichip Microelectronics *****END OF FILE****/
Index: Keyboard/Keyboard_EPOS/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/Keyboard/Keyboard_EPOS/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/Keyboard/Keyboard_EPOS/prj/GCC/makefile	(working copy)
@@ -23,39 +23,187 @@
              $(LIB_PATH)/core/misc \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
-             $(LIB_PATH)/sdk/yc_sysctrl \
-             $(LIB_PATH)/sdk/yc_timer\
-             $(LIB_PATH)/sdk/yc_lcd\
-             $(LIB_PATH)/sdk/yc_spi\
-             $(LIB_PATH)/sdk/yc_kscan\
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_spi \
+             $(LIB_PATH)/sdk/yc_kscan \
+             $(LIB_PATH)/sdk/yc_st7789
 
 
              
 USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+            $(USER_PATH)/font 
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
-          -I $(LIB_PATH)/sdk
+          -I $(LIB_PATH)/sdk \
+          -I $(USER_PATH)
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -66,7 +214,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: Keyboard/Keyboard_MPOS/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/Keyboard/Keyboard_MPOS/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/Keyboard/Keyboard_MPOS/prj/GCC/makefile	(working copy)
@@ -23,39 +23,186 @@
              $(LIB_PATH)/core/misc \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
-             $(LIB_PATH)/sdk/yc_sysctrl \
              $(LIB_PATH)/sdk/yc_timer\
-             $(LIB_PATH)/sdk/yc_lcd\
-             $(LIB_PATH)/sdk/yc_spi\
-             $(LIB_PATH)/sdk/yc_kscan\
+             $(LIB_PATH)/sdk/yc_lcd \
+             $(LIB_PATH)/sdk/yc_spi \
+             $(LIB_PATH)/sdk/yc_kscan
 
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
-          -I $(LIB_PATH)/sdk
+          -I $(LIB_PATH)/sdk \
+		  -I ../MDK
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -66,7 +213,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: Keyboard/Keyboard_MPOS/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/Keyboard/Keyboard_MPOS/prj/MDK/YC3121_Keil.uvprojx	(revision 723)
+++ /YC3121_demo/ModuleDemo/Keyboard/Keyboard_MPOS/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -184,6 +184,7 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
Index: Keyboard/Keyboard_MPOS/user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/Keyboard/Keyboard_MPOS/user/main.c	(revision 723)
+++ /YC3121_demo/ModuleDemo/Keyboard/Keyboard_MPOS/user/main.c	(working copy)
@@ -119,6 +119,7 @@
   */
 void LCD_Configuration(void)
 {
+	#if (BOARD_VER == MPOS_BOARD_V2_1)
     LCD_InitTypedef LCD_ConfigureStructure;
 
     LCD_ConfigureStructure.SPIx = LCD_SPI;
@@ -139,6 +140,9 @@
 
     /* Initialize the LCD screen */
     init_lcd();
+	#else
+		MyPrintf("BOARD_VER not support Keyboard_MPOS test\r\n");
+	#endif
 }
 
 void TIMER_Configuration(void)
Index: LPM_SLEEP/LPM_TEST/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/LPM_SLEEP/LPM_TEST/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/LPM_SLEEP/LPM_TEST/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: LPM_SLEEP/LPM_TEST/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/LPM_SLEEP/LPM_TEST/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/LPM_SLEEP/LPM_TEST/prj/GCC/makefile	(working copy)
@@ -0,0 +1,236 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_trng \
+             $(LIB_PATH)/sdk/yc_sysctrl
+
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(USER_PATH)
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: LPM_SLEEP/LPM_TEST/prj/MDK/YC3121_Keil.uvoptx
===================================================================
--- /YC3121_demo/ModuleDemo/LPM_SLEEP/LPM_TEST/prj/MDK/YC3121_Keil.uvoptx	(revision 723)
+++ /YC3121_demo/ModuleDemo/LPM_SLEEP/LPM_TEST/prj/MDK/YC3121_Keil.uvoptx	(working copy)
@@ -219,6 +219,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\..\Librarier\core\bt_code.c</PathWithFileName>
+      <FilenameWithoutPath>bt_code.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -229,7 +241,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>2</GroupNumber>
-      <FileNumber>3</FileNumber>
+      <FileNumber>4</FileNumber>
       <FileType>1</FileType>
       <tvExp>1</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -239,18 +251,6 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
-    <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>4</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\..\user\bt_code.c</PathWithFileName>
-      <FilenameWithoutPath>bt_code.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
   </Group>
 
   <Group>
Index: LPM_SLEEP/LPM_TEST/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/LPM_SLEEP/LPM_TEST/prj/MDK/YC3121_Keil.uvprojx	(revision 723)
+++ /YC3121_demo/ModuleDemo/LPM_SLEEP/LPM_TEST/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -184,6 +184,7 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
@@ -391,6 +392,11 @@
               <FileType>1</FileType>
               <FilePath>..\..\..\..\..\Librarier\core\system.c</FilePath>
             </File>
+            <File>
+              <FileName>bt_code.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\core\bt_code.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
@@ -401,11 +407,6 @@
               <FileType>1</FileType>
               <FilePath>..\..\user\main.c</FilePath>
             </File>
-            <File>
-              <FileName>bt_code.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\user\bt_code.c</FilePath>
-            </File>
           </Files>
         </Group>
         <Group>
Index: LPM_SLEEP/M0_lpmsleep/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/LPM_SLEEP/M0_lpmsleep/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/LPM_SLEEP/M0_lpmsleep/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: LPM_SLEEP/M0_lpmsleep/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/LPM_SLEEP/M0_lpmsleep/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/LPM_SLEEP/M0_lpmsleep/prj/GCC/makefile	(working copy)
@@ -0,0 +1,235 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_sysctrl
+
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(USER_PATH)
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: LPM_SLEEP/M0_lpmsleep/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/LPM_SLEEP/M0_lpmsleep/prj/MDK/YC3121_Keil.uvprojx	(revision 723)
+++ /YC3121_demo/ModuleDemo/LPM_SLEEP/M0_lpmsleep/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -392,6 +392,11 @@
               <FileType>1</FileType>
               <FilePath>..\..\..\..\..\Librarier\core\system.c</FilePath>
             </File>
+            <File>
+              <FileName>bt_code.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\core\bt_code.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
@@ -402,11 +407,6 @@
               <FileType>1</FileType>
               <FilePath>..\..\user\main.c</FilePath>
             </File>
-            <File>
-              <FileName>bt_code.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\user\bt_code.c</FilePath>
-            </File>
           </Files>
         </Group>
         <Group>
Index: MPU/mpu/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/MPU/mpu/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/MPU/mpu/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: MPU/mpu/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/MPU/mpu/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/MPU/mpu/prj/GCC/makefile	(working copy)
@@ -0,0 +1,234 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart 
+
+
+             
+USER_OBJS = $(USER_PATH)/main \
+            $(USER_PATH)/mpu_test/mpu_test \
+            $(USER_PATH)/mpu_test/mpu_share_func \
+            $(USER_PATH)/mpu_test/mpu_func
+
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(USER_PATH)/mpu_test
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: MPU/mpu/prj/MDK/YC3121_Keil.uvoptx
===================================================================
--- /YC3121_demo/ModuleDemo/MPU/mpu/prj/MDK/YC3121_Keil.uvoptx	(revision 723)
+++ /YC3121_demo/ModuleDemo/MPU/mpu/prj/MDK/YC3121_Keil.uvoptx	(working copy)
@@ -224,26 +224,26 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
-  </Group>
-
-  <Group>
-    <GroupName>main</GroupName>
-    <tvExp>1</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>2</GroupNumber>
+      <GroupNumber>1</GroupNumber>
       <FileNumber>3</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\user\main.c</PathWithFileName>
-      <FilenameWithoutPath>main.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\..\..\..\Librarier\core\bt_code.c</PathWithFileName>
+      <FilenameWithoutPath>bt_code.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+  </Group>
+
+  <Group>
+    <GroupName>main</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>2</GroupNumber>
       <FileNumber>4</FileNumber>
@@ -251,8 +251,8 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\user\bt_code.c</PathWithFileName>
-      <FilenameWithoutPath>bt_code.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\user\main.c</PathWithFileName>
+      <FilenameWithoutPath>main.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
Index: MPU/mpu/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/MPU/mpu/prj/MDK/YC3121_Keil.uvprojx	(revision 723)
+++ /YC3121_demo/ModuleDemo/MPU/mpu/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -392,6 +392,11 @@
               <FileType>1</FileType>
               <FilePath>..\..\..\..\..\Librarier\core\system.c</FilePath>
             </File>
+            <File>
+              <FileName>bt_code.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\core\bt_code.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
@@ -402,11 +407,6 @@
               <FileType>1</FileType>
               <FilePath>..\..\user\main.c</FilePath>
             </File>
-            <File>
-              <FileName>bt_code.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\user\bt_code.c</FilePath>
-            </File>
           </Files>
         </Group>
         <Group>
Index: MSR/MSR/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/MSR/MSR/prj/GCC/makefile	(revision 731)
+++ /YC3121_demo/ModuleDemo/MSR/MSR/prj/GCC/makefile	(working copy)
@@ -23,35 +23,182 @@
              $(LIB_PATH)/core/misc \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
-             $(LIB_PATH)/sdk/yc_sysctrl \
-             $(LIB_PATH)/sdk/yc_msr
+             $(LIB_PATH)/sdk/yc_timer
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
-          -I $(LIB_PATH)/sdk
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_msr
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
-LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_msr/libyc_msr.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -62,7 +209,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: MSR/MSR_IT/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/MSR/MSR_IT/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/MSR/MSR_IT/prj/GCC/makefile	(working copy)
@@ -23,35 +23,183 @@
              $(LIB_PATH)/core/misc \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
-             $(LIB_PATH)/sdk/yc_sysctrl \
-             $(LIB_PATH)/sdk/yc_msr
+             $(LIB_PATH)/sdk/yc_timer 
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
+USER_OBJS = $(USER_PATH)/main 
+
+
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
-          -I $(LIB_PATH)/sdk
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_msr
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
-LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap  $(LIB_PATH)/sdk/yc_msr/libyc_msr.a -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -62,7 +210,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: NFC/YC5018/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/NFC/YC5018/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/NFC/YC5018/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: NFC/YC5018/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/NFC/YC5018/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/NFC/YC5018/prj/GCC/makefile	(working copy)
@@ -0,0 +1,237 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_spi \
+             $(LIB_PATH)/sdk/yc_systick \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_bt \
+             $(LIB_PATH)/sdk/yc_nfc/yc_nfc_common \
+             $(LIB_PATH)/sdk/yc_nfc/yc_emv_contactless_l1
+             
+USER_OBJS = $(USER_PATH)/main 
+
+
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_nfc \
+          -I $(USER_PATH)
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: OTP/otp_read_write/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/OTP/otp_read_write/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/OTP/otp_read_write/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: OTP/otp_read_write/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/OTP/otp_read_write/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/OTP/otp_read_write/prj/GCC/makefile	(working copy)
@@ -0,0 +1,229 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_otp 
+
+             
+USER_OBJS = $(USER_PATH)/main 
+
+
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: POS/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/POS/prj/GCC/makefile	(revision 732)
+++ /YC3121_demo/ModuleDemo/POS/prj/GCC/makefile	(working copy)
@@ -11,7 +11,7 @@
 AS = $(ARCH)-as
 OBJCOPY = $(ARCH)-objcopy
 OBJDUMP = "$(ARCH)-objdump"
-LIB_PATH = ../../../../../Librarier
+LIB_PATH = ../../../../Librarier
 USER_PATH = ../../user
 
 
@@ -21,40 +21,219 @@
 CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
              $(LIB_PATH)/core/system \
              $(LIB_PATH)/core/misc \
-             $(LIB_PATH)/sdk/yc_gpio \
-             $(LIB_PATH)/sdk/yc_uart \
-             $(LIB_PATH)/sdk/yc_spi \
+             $(LIB_PATH)/sdk/yc_adc \
+             $(LIB_PATH)/sdk/yc_bt \
+             $(LIB_PATH)/sdk/yc_chrg \
+			 $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_iic \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_kscan \
              $(LIB_PATH)/sdk/yc_lcd \
-             $(LIB_PATH)/sdk/yc_timer
-
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_power \
+             $(LIB_PATH)/sdk/yc_rtc \
+             $(LIB_PATH)/sdk/yc_spi \
+             $(LIB_PATH)/sdk/yc_st7789 \
+             $(LIB_PATH)/sdk/yc_sysctrl \
+             $(LIB_PATH)/sdk/yc_systick \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_touch \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_nfc/yc_nfc_common \
+             $(LIB_PATH)/sdk/yc_nfc/yc_emv_contactless_l1 \
+             $(LIB_PATH)/sdk/yc_7816/yc_7816 \
+             $(LIB_PATH)/sdk/yc_7816/yc_7816_T0 \
+             $(LIB_PATH)/sdk/yc_7816/yc_7816_T1 
 
 
              
 USER_OBJS = $(USER_PATH)/main \
+            $(USER_PATH)/meun \
+            $(USER_PATH)/font \
             $(USER_PATH)/bt_code
-			
+
+LIB_OBJS = $(LIB_PATH)/sdk/libyc_qspi.a \
+           $(LIB_PATH)/sdk/yc_msr/libyc_msr.a \
+           $(LIB_PATH)/sdk/yc_qr/YC_QRDecode_lib.a
+           
+
+
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
-          -I $(LIB_PATH)/sdk
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_7816 \
+          -I $(LIB_PATH)/sdk/yc_nfc \
+          -I $(LIB_PATH)/sdk/yc_msr \
+          -I $(LIB_PATH)/sdk/yc_qr \
+          -I $(USER_PATH)
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
-LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_OBJS) -lc -lm -lgcc -lnosys -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x100000 /* 1M */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -65,7 +244,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: POS/prj/MDK/YC3121_Keil.uvoptx
===================================================================
--- /YC3121_demo/ModuleDemo/POS/prj/MDK/YC3121_Keil.uvoptx	(revision 732)
+++ /YC3121_demo/ModuleDemo/POS/prj/MDK/YC3121_Keil.uvoptx	(working copy)
@@ -577,7 +577,7 @@
       <GroupNumber>5</GroupNumber>
       <FileNumber>29</FileNumber>
       <FileType>1</FileType>
-      <tvExp>1</tvExp>
+      <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
       <PathWithFileName>..\..\..\..\Librarier\sdk\yc_nfc\yc_emv_contactless_l1.c</PathWithFileName>
@@ -597,7 +597,7 @@
       <GroupNumber>6</GroupNumber>
       <FileNumber>30</FileNumber>
       <FileType>1</FileType>
-      <tvExp>1</tvExp>
+      <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
       <PathWithFileName>..\..\..\..\Librarier\sdk\yc_7816\yc_7816.c</PathWithFileName>
Index: POS/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/POS/prj/MDK/YC3121_Keil.uvprojx	(revision 732)
+++ /YC3121_demo/ModuleDemo/POS/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -321,7 +321,7 @@
             <PlainCh>0</PlainCh>
             <Ropi>0</Ropi>
             <Rwpi>0</Rwpi>
-            <wLevel>2</wLevel>
+            <wLevel>1</wLevel>
             <uThumb>0</uThumb>
             <uSurpInc>0</uSurpInc>
             <uC99>1</uC99>
Index: POS/user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/POS/user/main.c	(revision 732)
+++ /YC3121_demo/ModuleDemo/POS/user/main.c	(working copy)
@@ -65,12 +65,16 @@
 	MyPrintf("Yichip Yc3121 POS Demo V1.0.\r\n");
 	MyPrintf("build date:%s-%s\r\n",__DATE__,__TIME__);
 	TFT_SPI_Init();
+	#if (VERSIONS == EXIST_BT)
 	app_bt_init();
+	#endif
 	Display_InterfaceWindow();
 
 	while(1)
 	{
+		#if (VERSIONS == EXIST_BT)
 		BT_Progress();
+		#endif
 		MeunState_Check_Update();
 	}
 }
Index: POS/user/meun.h
===================================================================
--- /YC3121_demo/ModuleDemo/POS/user/meun.h	(revision 732)
+++ /YC3121_demo/ModuleDemo/POS/user/meun.h	(working copy)
@@ -30,6 +30,8 @@
 void BEEP_PWM_Init(void);
 void TFT_Power_scan(void);
 void TFT_Single_scan(void);
+#if (VERSIONS == EXIST_BT)
 void app_bt_init(void);
 void show_bt_status(Boolean status);
 #endif
+#endif
Index: POS/user/meun.c
===================================================================
--- /YC3121_demo/ModuleDemo/POS/user/meun.c	(revision 732)
+++ /YC3121_demo/ModuleDemo/POS/user/meun.c	(working copy)
@@ -68,7 +68,7 @@
 	return i;//str len
 }
 
-
+#if (VERSIONS == EXIST_BT)
 #define BNEP_STATUS_IDLE					0x00
 #define BNEP_STATUS_CONNECTING		0x01
 #define BNEP_STATUS_CONNECTED			0x10
@@ -113,6 +113,7 @@
 uint8_t bt_cod[3] = {0x24,0x04,0x04};
 uint8_t NvramData[NVRAM_LEN]={0};
 Boolean btStatus=FALSE;
+Boolean btInitSucc=TRUE;
 void app_bt_init(void)
 {
 	uint8_t bt_addr[6] =  {0x00,0x00,0x00,0x33,0x22,0x10};
@@ -129,63 +130,96 @@
 
 	if(BT_SetBleName(bt_name,sizeof(bt_name)-1)==TRUE) 
 		MyPrintf("SetBleName_suc ble name:%s\n",bt_name);
-	else 
-		MyPrintf("SetBleName_failed\n");
+	else
+    {
+        MyPrintf("SetBleName_failed\n");
+        btInitSucc=FALSE;
+    }
 	
 	if(BT_SetBtName(bt_name,sizeof(bt_name)-1) == TRUE)//bt与ble名字地址可以设置成一样
 		MyPrintf("SetbtName_suc\n");
-	else 
+	else
+    {
 		MyPrintf("SetbtName_fail\n");
+        btInitSucc=FALSE;
+    }
 	
 	if(BT_SetBleAddr(bt_addr) == TRUE) 
 		MyPrintf("SetBleAddr_suc\n");
-	else 
+	else
+    {
 		MyPrintf("SetBleAddr_fail\n"); 
+        btInitSucc=FALSE;
+    }
 	
 	if(BT_SetBtAddr(bt_addr) == TRUE)
 		MyPrintf("SetBtAddr_suc\n");
-	else 
+	else
+    {
 		MyPrintf("SetBtAddr_fail\n");
+        btInitSucc=FALSE;
+    } 
 	
 	if(BT_SetParingMode(0x01) == TRUE)
 		MyPrintf("set confirmkey mode success\n");
 	else
+    {
 		MyPrintf("set confirmkey mode failed\n");
+        btInitSucc=FALSE;
+    } 
 	
 	if(BT_SetCOD(bt_cod) == TRUE) //设置bt3.0设备类型
 		MyPrintf("set COD sucess\n");
 	else
+    {
 		MyPrintf("set COD failed\n");
+        btInitSucc=FALSE;
+    } 
 
 	
 	if(BT_DeleteService() == TRUE) //  删除用户自定义服务
 		MyPrintf("delete service sucess\n");
 	else
+    {
 		MyPrintf("delete service failed\n");
+        btInitSucc=FALSE;
+    } 
 
 	temp_handle=BT_AddBleService(ble_service_uuid_lsps,sizeof(ble_service_uuid_lsps));
 	if( temp_handle!= 0)  //增加服务 返回handle无需保存
 		MyPrintf("add service sucess,handle=%04x\n",temp_handle);
 	else
+    {
 		MyPrintf("add service failed,return=%04x\n",temp_handle);
+        btInitSucc=FALSE;
+    } 
 	
 	ble_send_handle=BT_AddBleCharacteristic(ble_Characteristic_uuid_lsps_tx,sizeof(ble_Characteristic_uuid_lsps_tx));
 	if( ble_send_handle!= 0)  //增加服务的TX特征,返回的handle需要保存，发ble数据时使用
 		MyPrintf("add Characteristic tx sucess,handle=%04x\n",ble_send_handle);
 	else
+    {
 		MyPrintf("add Characteristic tx failed,return=%04x\n",ble_send_handle);
+        btInitSucc=FALSE;
+    } 
 	
 	temp_handle=BT_AddBleCharacteristic(ble_Characteristic_uuid_lsps_rx,sizeof(ble_Characteristic_uuid_lsps_rx));
 	if( temp_handle!= 0)  //增加服务的RX特征,返回的handle不需保存
 		MyPrintf("add Characteristic rx sucess;handle=%04x\n",temp_handle);
 	else
+    {
 		MyPrintf("add Characteristic rx failed,return=%04x\n",temp_handle);
+        btInitSucc=FALSE;
+    } 
 
 
 	if(BT_SetVisibility(0x01,0x01,0x01) == TRUE)  //设置可发现
 		MyPrintf("SetVisibility sucess\n");
 	else
+    {
 		MyPrintf("SetVisibility failed\n");
+        btInitSucc=FALSE;
+    } 
 	
 	MyPrintf("bt version=%x\n",BT_GetVersion());
 	
@@ -203,9 +237,22 @@
 		MyPrintf("\n");
 	}
 	else
+    {
 		MyPrintf("set nvram failed\n");
+        btInitSucc=FALSE;
+    } 
 	
-	MyPrintf("bt init finish\n");
+    if(btInitSucc==TRUE)
+    {
+	    MyPrintf("bt init finish\n");
+    }
+    else
+    {
+        memcpy(bt_name,"bt init fail",12);
+        bt_name[12]=0;
+        MyPrintf("bt init fail\n");
+    }
+    
 }
 
 void BT_IRQHandler()
@@ -928,6 +975,7 @@
 		ST7789_TFT_Clear_White(80, 4, 80+15, 4+19);
 	}
 }
+#endif
 
 void Display_InterfaceWindow(void)
 {
@@ -939,9 +987,11 @@
     ST7789_TFT_ShowString(175, 111, 128, 16, "YC3121-E", 32, 1, WHITE, OLIVE);
     ST7789_TFT_Picture_Q(25, 80, gImage_Yichip);
     ST7789_TFT_ShowString(10, 160, 300, 12, "TUSN:00000302Q3NL01638914", 24, 1, WHITE, OLIVE);
-	ST7789_TFT_ShowString(10, 185, 300, 12, "bt name:", 24, 1, WHITE, OLIVE);
-	ST7789_TFT_ShowString(106, 185, 300, 12, bt_name, 24, 1, WHITE, OLIVE);
-	show_bt_status(FALSE);
+		#if (VERSIONS == EXIST_BT)
+		ST7789_TFT_ShowString(10, 185, 300, 12, "bt name:", 24, 1, WHITE, OLIVE);
+		ST7789_TFT_ShowString(106, 185, 300, 12, bt_name, 24, 1, WHITE, OLIVE);
+		show_bt_status(FALSE);
+		#endif
     TFT_Power_scan();
     TFT_Single_scan();
 }
@@ -959,7 +1009,11 @@
     ST7789_TFT_ShowChinese(155, 72, jiaoyichaxun_ch, 32, 5, 1, WHITE, OLIVE);
     ST7789_TFT_ShowChinese(5, 115, guanli_ch, 32, 4, 1, WHITE, OLIVE);
     ST7789_TFT_ShowChinese(155, 115, tupianceshi_ch, 32, 5, 1, WHITE, OLIVE);
+		#if (VERSIONS == EXIST_BT)
     ST7789_TFT_ShowString(5, 158,  96,  16, "7.BNEP", 32, 1, WHITE, OLIVE);
+		#else
+		ST7789_TFT_ShowChinese(5, 158, jiesuan_ch, 32, 4, 1, WHITE, OLIVE);
+		#endif
     ST7789_TFT_ShowChinese(155, 158, TPTest_ch, 32, 5, 1, WHITE, OLIVE);
     ST7789_TFT_ShowChinese(5, 201, CARDTest_ch, 32, 5, 1, WHITE, OLIVE);
 }
@@ -1575,6 +1629,7 @@
     TFT_Single_scan();
 }
 
+#if (VERSIONS == EXIST_BT)
 static void Display_bnepTest(void)
 {
 	uint8_t keyCode=0;
@@ -1733,7 +1788,7 @@
 	TFT_Power_scan();
 	TFT_Single_scan();
 }
-
+#endif
 /*************************************************QR_Code start*****************************************************************/
 #include "YC_QRDecode.h"
 #include "YC_QRDecode_TypeDef.h"
@@ -2230,10 +2285,14 @@
         meunState = 0;
         Display_picturetest();
         break;
+		
+		#if (VERSIONS == EXIST_BT)
     case KEY_NUM_7:
         meunState = 0;
         Display_bnepTest();
         break;
+		#endif
+		
     case KEY_NUM_8:
         meunState = 0;
         Display_touch();
Index: POWER/POWER_keyscan/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/POWER/POWER_keyscan/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/POWER/POWER_keyscan/prj/GCC/makefile	(working copy)
@@ -21,42 +21,189 @@
 CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
              $(LIB_PATH)/core/system \
              $(LIB_PATH)/core/misc \
-             $(LIB_PATH)/sdk/yc_sysctrl \
+             $(LIB_PATH)/core/bt_code \
              $(LIB_PATH)/sdk/yc_gpio \
-             $(LIB_PATH)/sdk/yc_uart 
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_power \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_sysctrl 
              
-
-
-             
-             
-
-
-             
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
-          -I $(LIB_PATH)/sdk
+          -I $(LIB_PATH)/sdk \
+          -I $(USER_PATH)
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -67,7 +214,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: POWER/POWER_off/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/POWER/POWER_off/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/POWER/POWER_off/prj/GCC/makefile	(working copy)
@@ -21,42 +21,190 @@
 CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
              $(LIB_PATH)/core/system \
              $(LIB_PATH)/core/misc \
-             $(LIB_PATH)/sdk/yc_sysctrl \
+             $(LIB_PATH)/core/bt_code \
              $(LIB_PATH)/sdk/yc_gpio \
-             $(LIB_PATH)/sdk/yc_uart 
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_power \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_sysctrl 
              
+USER_OBJS = $(USER_PATH)/main 
 
 
-             
-             
-
-
-             
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
-          -I $(LIB_PATH)/sdk
+          -I $(LIB_PATH)/sdk \
+          -I $(USER_PATH)
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -67,7 +215,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: QRDecode/QRDecode_demo/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/QRDecode/QRDecode_demo/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/QRDecode/QRDecode_demo/prj/GCC/makefile	(working copy)
@@ -21,40 +21,195 @@
 CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
              $(LIB_PATH)/core/system \
              $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
              $(LIB_PATH)/sdk/yc_spi \
-             $(LIB_PATH)/sdk/yc_lcd \
-             $(LIB_PATH)/sdk/yc_timer
-
-
-
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_sysctrl \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_st7789 \
+             $(LIB_PATH)/sdk/yc_kscan \
+             $(LIB_PATH)/sdk/yc_ipc
              
 USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
+            $(USER_PATH)/font
+            
+
+
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
-          -I $(LIB_PATH)/sdk
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_qr \
+          -I $(USER_PATH)
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
-LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/yc_qr/YC_QRDecode_lib.a  -lc -lm -lgcc -lnosys -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x100000 /* 1M */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -65,7 +220,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: QSPI/QSPI_encrypt_rw/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/QSPI/QSPI_encrypt_rw/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/QSPI/QSPI_encrypt_rw/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: QSPI/QSPI_encrypt_rw/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/QSPI/QSPI_encrypt_rw/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/QSPI/QSPI_encrypt_rw/prj/GCC/makefile	(working copy)
@@ -0,0 +1,229 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_otp 
+             
+USER_OBJS = $(USER_PATH)/main 
+            
+
+
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk 
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/libyc_qspi.a  -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: QSPI/QSPI_read_flash_size/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/QSPI/QSPI_read_flash_size/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/QSPI/QSPI_read_flash_size/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: QSPI/QSPI_read_flash_size/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/QSPI/QSPI_read_flash_size/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/QSPI/QSPI_read_flash_size/prj/GCC/makefile	(working copy)
@@ -0,0 +1,229 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+ 
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_otp 
+             
+USER_OBJS = $(USER_PATH)/main 
+            
+
+
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk 
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap $(LIB_PATH)/sdk/libyc_qspi.a  -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: RNG/RNG_Polling/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/RNG/RNG_Polling/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/RNG/RNG_Polling/prj/GCC/makefile	(working copy)
@@ -26,31 +26,180 @@
              $(LIB_PATH)/sdk/yc_trng
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
+USER_OBJS = $(USER_PATH)/main 
+            
+
+
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -61,7 +210,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: SPI/SPI_FLASH/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/SPI/SPI_FLASH/prj/GCC/makefile	(revision 725)
+++ /YC3121_demo/ModuleDemo/SPI/SPI_FLASH/prj/GCC/makefile	(working copy)
@@ -26,31 +26,180 @@
              $(LIB_PATH)/sdk/yc_spi
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
+USER_OBJS = $(USER_PATH)/main 
+            
+
+
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -61,7 +210,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: SPI/SPI_LCD/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/SPI/SPI_LCD/prj/GCC/makefile	(revision 725)
+++ /YC3121_demo/ModuleDemo/SPI/SPI_LCD/prj/GCC/makefile	(working copy)
@@ -24,37 +24,184 @@
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
              $(LIB_PATH)/sdk/yc_spi \
-             $(LIB_PATH)/sdk/yc_lcd \
-             $(LIB_PATH)/sdk/yc_timer
-
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_lcd
+             
+             
+USER_OBJS = $(USER_PATH)/main 
+            
 
 
-             
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -65,7 +212,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: SPI/SPI_LCD/user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/SPI/SPI_LCD/user/main.c	(revision 725)
+++ /YC3121_demo/ModuleDemo/SPI/SPI_LCD/user/main.c	(working copy)
@@ -146,6 +146,7 @@
   */
 void LCD_Configuration(void)
 {
+	#if (BOARD_VER == MPOS_BOARD_V2_1)
     LCD_InitTypedef LCD_ConfigureStructure;
 
     LCD_ConfigureStructure.SPIx = LCD_SPI;
@@ -166,6 +167,9 @@
 
     /* Initialize the LCD screen */
     init_lcd();
+	#else
+		MyPrintf("BOARD_VER not support SPI_LCD test\r\n");
+	#endif
 }
 
 /**
@@ -175,6 +179,7 @@
   */
 void SPI_LCD_Test(void)
 {
+	#if (BOARD_VER == MPOS_BOARD_V2_1)
     unsigned char i;
 
     clr_screen();
@@ -205,6 +210,9 @@
         set_xy(100, i + 2);
         write_bytes_lcd(&Bmp005[24 * i], 24, LCD_RS_DATA);
     }
+	#else
+		MyPrintf("BOARD_VER not support SPI_LCD test\r\n");
+	#endif
 }
 
 /************************ (C) COPYRIGHT Yichip Microelectronics *****END OF FILE****/
Index: SPI/SPI_SLAVER/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/SPI/SPI_SLAVER/prj/GCC/makefile	(revision 725)
+++ /YC3121_demo/ModuleDemo/SPI/SPI_SLAVER/prj/GCC/makefile	(working copy)
@@ -26,31 +26,180 @@
              $(LIB_PATH)/sdk/yc_spi
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
+USER_OBJS = $(USER_PATH)/main 
+            
+
+
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -61,7 +210,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: SPI/SPI_TFT/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/SPI/SPI_TFT/prj/GCC/makefile	(revision 725)
+++ /YC3121_demo/ModuleDemo/SPI/SPI_TFT/prj/GCC/makefile	(working copy)
@@ -24,37 +24,186 @@
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
              $(LIB_PATH)/sdk/yc_spi \
-             $(LIB_PATH)/sdk/yc_lcd \
-             $(LIB_PATH)/sdk/yc_timer
-
-
-
+             $(LIB_PATH)/sdk/yc_st7789 \
+             $(LIB_PATH)/sdk/yc_timer 
+             
              
 USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
+            $(USER_PATH)/font
+            
+
+
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
-          -I $(LIB_PATH)/sdk
+          -I $(LIB_PATH)/sdk \
+          -I $(USER_PATH)
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -65,7 +214,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: SPI/SPI_TFT/user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/SPI/SPI_TFT/user/main.c	(revision 725)
+++ /YC3121_demo/ModuleDemo/SPI/SPI_TFT/user/main.c	(working copy)
@@ -57,9 +57,9 @@
     SPI_TFT_Test();
 
     uint8_t str[25] = {"YC3121-C1234,567891234567"};
-
+    #if (BOARD_VER == EPOS_BOARD_V1_0)
     ST7789_TFT_ShowString(175, 136, 25 * 16, 16, str, 32, 1, WHITE, OLIVE);
-
+    #endif
     while (1)
     {
 
@@ -104,6 +104,7 @@
   */
 void TFT_Configuration(void)
 {
+  #if (BOARD_VER == EPOS_BOARD_V1_0)
     St7789TFT_InitTypedef St7789TFT_InitStruct;
 
     St7789TFT_InitStruct.SPIx = ST7789VTFTSPI;
@@ -122,6 +123,9 @@
 
     ST7789_TFT_GpioInit(&St7789TFT_InitStruct);
     ST7789_TFT_Init();
+  #else
+		MyPrintf("BOARD_VER not support SPI_TFT test\r\n");
+	#endif
 }
 
 /**
@@ -131,12 +135,16 @@
   */
 void SPI_TFT_Test(void)
 {
+  #if (BOARD_VER == EPOS_BOARD_V1_0)
     ST7789_TFT_Clear_White(0, 28, TFT_COL, TFT_ROW);
     ST7789_TFT_ShowChinese(100, 1, Yichip_ch, 24, 5, 1, WHITE, OLIVE);
     ST7789_TFT_Draw_Piece(0, 27, TFT_COL, 28, DGRAY);
     ST7789_TFT_ShowChinese(165, 95, Welcom_ch, 36, 4, 1, WHITE, OLIVE);
     ST7789_TFT_ShowString(175, 136, 128, 16, "YC3121-C", 32, 1, WHITE, OLIVE);
     ST7789_TFT_Picture_Q(25, 105, gImage_Yichip);
+  #else
+		MyPrintf("BOARD_VER not support SPI_TFT test\r\n");
+	#endif
 }
 
 /************************ (C) COPYRIGHT Yichip Microelectronics *****END OF FILE****/
Index: SYSTICK/Systick_MS/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/SYSTICK/Systick_MS/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/SYSTICK/Systick_MS/prj/GCC/makefile	(working copy)
@@ -26,31 +26,180 @@
              $(LIB_PATH)/sdk/yc_systick
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
+USER_OBJS = $(USER_PATH)/main 
+            
+
+
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -61,7 +210,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: SYSTICK/Systick_intr/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/SYSTICK/Systick_intr/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/SYSTICK/Systick_intr/prj/GCC/makefile	(working copy)
@@ -26,31 +26,180 @@
              $(LIB_PATH)/sdk/yc_systick
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
+USER_OBJS = $(USER_PATH)/main
+            
+
+
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -61,7 +210,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: TOUCH/Touch/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/TOUCH/Touch/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/TOUCH/Touch/prj/GCC/makefile	(working copy)
@@ -21,40 +21,197 @@
 CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
              $(LIB_PATH)/core/system \
              $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
              $(LIB_PATH)/sdk/yc_gpio \
              $(LIB_PATH)/sdk/yc_uart \
              $(LIB_PATH)/sdk/yc_spi \
-             $(LIB_PATH)/sdk/yc_lcd \
-             $(LIB_PATH)/sdk/yc_timer
-
-
-
+             $(LIB_PATH)/sdk/yc_st7789 \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_touch \
+             $(LIB_PATH)/sdk/yc_adc \
+             $(LIB_PATH)/sdk/yc_otp \
+             $(LIB_PATH)/sdk/yc_kscan \
+             $(LIB_PATH)/sdk/yc_sysctrl \
+             $(LIB_PATH)/sdk/yc_lpm \
+             $(LIB_PATH)/sdk/yc_ipc
+             
              
 USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
+            $(USER_PATH)/font
+            
+            
+
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
-          -I $(LIB_PATH)/sdk
+          -I $(LIB_PATH)/sdk \
+          -I $(USER_PATH)
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -65,7 +222,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: Timer/Timer_Interrupt/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/Timer/Timer_Interrupt/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/Timer/Timer_Interrupt/prj/GCC/makefile	(working copy)
@@ -26,31 +26,180 @@
              $(LIB_PATH)/sdk/yc_timer
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
+USER_OBJS = $(USER_PATH)/main
+            
+
+
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -61,7 +210,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: Timer/Timer_PWM/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/Timer/Timer_PWM/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/Timer/Timer_PWM/prj/GCC/makefile	(working copy)
@@ -26,31 +26,180 @@
              $(LIB_PATH)/sdk/yc_timer
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
-			
+USER_OBJS = $(USER_PATH)/main
+            
+
+
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
 INC_DIR = -I $(LIB_PATH)/core \
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -61,7 +210,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: UART/UART_Interrupt/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/UART/UART_Interrupt/prj/GCC/makefile	(revision 731)
+++ /YC3121_demo/ModuleDemo/UART/UART_Interrupt/prj/GCC/makefile	(working copy)
@@ -25,8 +25,7 @@
              $(LIB_PATH)/sdk/yc_uart
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -34,22 +33,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -60,7 +207,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: UART/UART_Interrupt/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/UART/UART_Interrupt/prj/MDK/YC3121_Keil.uvprojx	(revision 731)
+++ /YC3121_demo/ModuleDemo/UART/UART_Interrupt/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -184,6 +184,7 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
Index: UART/UART_RX_RecvData/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/UART/UART_RX_RecvData/prj/GCC/makefile	(revision 731)
+++ /YC3121_demo/ModuleDemo/UART/UART_RX_RecvData/prj/GCC/makefile	(working copy)
@@ -25,8 +25,7 @@
              $(LIB_PATH)/sdk/yc_uart
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -34,22 +33,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -60,7 +207,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: UART/UART_RX_Recvbuf/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/UART/UART_RX_Recvbuf/prj/GCC/makefile	(revision 731)
+++ /YC3121_demo/ModuleDemo/UART/UART_RX_Recvbuf/prj/GCC/makefile	(working copy)
@@ -25,8 +25,7 @@
              $(LIB_PATH)/sdk/yc_uart
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -34,22 +33,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -60,7 +207,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: UART/UART_TX_SendData/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/UART/UART_TX_SendData/prj/GCC/makefile	(revision 731)
+++ /YC3121_demo/ModuleDemo/UART/UART_TX_SendData/prj/GCC/makefile	(working copy)
@@ -25,8 +25,7 @@
              $(LIB_PATH)/sdk/yc_uart
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -34,22 +33,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -60,7 +207,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: UART/UART_TX_SendData/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/UART/UART_TX_SendData/prj/MDK/YC3121_Keil.uvprojx	(revision 731)
+++ /YC3121_demo/ModuleDemo/UART/UART_TX_SendData/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -184,6 +184,7 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
Index: UART/UART_TX_Sendbuf/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/UART/UART_TX_Sendbuf/prj/GCC/makefile	(revision 731)
+++ /YC3121_demo/ModuleDemo/UART/UART_TX_Sendbuf/prj/GCC/makefile	(working copy)
@@ -25,8 +25,7 @@
              $(LIB_PATH)/sdk/yc_uart
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -34,22 +33,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -60,7 +207,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: USB/USB_CCID/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/USB/USB_CCID/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/USB/USB_CCID/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: USB/USB_CCID/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/USB/USB_CCID/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/USB/USB_CCID/prj/GCC/makefile	(working copy)
@@ -0,0 +1,247 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_usb/libraries/harward_Der/usb_core \
+             $(LIB_PATH)/sdk/yc_usb/libraries/harward_Der/Usb_dcd \
+             $(LIB_PATH)/sdk/yc_usb/libraries/harward_Der/Usb_dcd_init \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/core/usbd_core \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/core/usbd_ioreq \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/core/usbd_req \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/class/ccid/usbd_ccid_cmd \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/class/ccid/usbd_ccid_core \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/class/ccid/usbd_ccid_if \
+             $(LIB_PATH)/sdk/yc_usb/scpu_usb_ccid_Device_Demo/usb_main \
+             $(LIB_PATH)/sdk/yc_usb/scpu_usb_ccid_Device_Demo/usbd_desc \
+             $(LIB_PATH)/sdk/yc_usb/scpu_usb_ccid_Device_Demo/usbd_usr \
+             $(LIB_PATH)/sdk/yc_usb/scpu_usb_ccid_Device_Demo/sc_itf
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_usb/libraries/harward_Der \
+          -I $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/core \
+          -I $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/class/ccid \
+          -I $(LIB_PATH)/sdk/yc_usb/scpu_usb_ccid_Device_Demo
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: USB/USB_CCID/prj/MDK/YC3121_Keil.uvoptx
===================================================================
--- /YC3121_demo/ModuleDemo/USB/USB_CCID/prj/MDK/YC3121_Keil.uvoptx	(revision 725)
+++ /YC3121_demo/ModuleDemo/USB/USB_CCID/prj/MDK/YC3121_Keil.uvoptx	(working copy)
@@ -246,26 +246,26 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
-  </Group>
-
-  <Group>
-    <GroupName>main</GroupName>
-    <tvExp>1</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>2</GroupNumber>
+      <GroupNumber>1</GroupNumber>
       <FileNumber>3</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\user\main.c</PathWithFileName>
-      <FilenameWithoutPath>main.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\..\..\..\Librarier\core\bt_code.c</PathWithFileName>
+      <FilenameWithoutPath>bt_code.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+  </Group>
+
+  <Group>
+    <GroupName>main</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>2</GroupNumber>
       <FileNumber>4</FileNumber>
@@ -273,8 +273,8 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\user\bt_code.c</PathWithFileName>
-      <FilenameWithoutPath>bt_code.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\user\main.c</PathWithFileName>
+      <FilenameWithoutPath>main.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
Index: USB/USB_CCID/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/USB/USB_CCID/prj/MDK/YC3121_Keil.uvprojx	(revision 725)
+++ /YC3121_demo/ModuleDemo/USB/USB_CCID/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -184,6 +184,7 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
@@ -391,6 +392,11 @@
               <FileType>1</FileType>
               <FilePath>..\..\..\..\..\Librarier\core\system.c</FilePath>
             </File>
+            <File>
+              <FileName>bt_code.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\core\bt_code.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
@@ -401,11 +407,6 @@
               <FileType>1</FileType>
               <FilePath>..\..\user\main.c</FilePath>
             </File>
-            <File>
-              <FileName>bt_code.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\user\bt_code.c</FilePath>
-            </File>
           </Files>
         </Group>
         <Group>
Index: USB/USB_CDC/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/USB/USB_CDC/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/USB/USB_CDC/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: USB/USB_CDC/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/USB/USB_CDC/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/USB/USB_CDC/prj/GCC/makefile	(working copy)
@@ -0,0 +1,246 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_usb/libraries/harward_Der/usb_core \
+             $(LIB_PATH)/sdk/yc_usb/libraries/harward_Der/Usb_dcd \
+             $(LIB_PATH)/sdk/yc_usb/libraries/harward_Der/Usb_dcd_init \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/core/usbd_core \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/core/usbd_ioreq \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/core/usbd_req \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/class/CDC/usbd_cdc_core \
+             $(LIB_PATH)/sdk/yc_usb/scpu_usb_CDC_Device_Demo/usb_main \
+             $(LIB_PATH)/sdk/yc_usb/scpu_usb_CDC_Device_Demo/usbd_desc \
+             $(LIB_PATH)/sdk/yc_usb/scpu_usb_CDC_Device_Demo/usbd_usr \
+             $(LIB_PATH)/sdk/yc_usb/scpu_usb_CDC_Device_Demo/usb_bsp \
+             $(LIB_PATH)/sdk/yc_usb/scpu_usb_CDC_Device_Demo/usbd_cdc_vcp
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_usb/libraries/harward_Der \
+          -I $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/core \
+          -I $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/class/CDC \
+          -I $(LIB_PATH)/sdk/yc_usb/scpu_usb_CDC_Device_Demo
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: USB/USB_CDC/prj/MDK/YC3121_Keil.uvoptx
===================================================================
--- /YC3121_demo/ModuleDemo/USB/USB_CDC/prj/MDK/YC3121_Keil.uvoptx	(revision 725)
+++ /YC3121_demo/ModuleDemo/USB/USB_CDC/prj/MDK/YC3121_Keil.uvoptx	(working copy)
@@ -246,26 +246,26 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
-  </Group>
-
-  <Group>
-    <GroupName>main</GroupName>
-    <tvExp>1</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>2</GroupNumber>
+      <GroupNumber>1</GroupNumber>
       <FileNumber>3</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\user\bt_code.c</PathWithFileName>
+      <PathWithFileName>..\..\..\..\..\Librarier\core\bt_code.c</PathWithFileName>
       <FilenameWithoutPath>bt_code.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+  </Group>
+
+  <Group>
+    <GroupName>main</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>2</GroupNumber>
       <FileNumber>4</FileNumber>
@@ -510,7 +510,7 @@
       <GroupNumber>5</GroupNumber>
       <FileNumber>22</FileNumber>
       <FileType>1</FileType>
-      <tvExp>0</tvExp>
+      <tvExp>1</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
       <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_usb\scpu_usb_CDC_Device_Demo\usb_main.c</PathWithFileName>
Index: USB/USB_CDC/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/USB/USB_CDC/prj/MDK/YC3121_Keil.uvprojx	(revision 725)
+++ /YC3121_demo/ModuleDemo/USB/USB_CDC/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -184,6 +184,7 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
@@ -391,17 +392,17 @@
               <FileType>1</FileType>
               <FilePath>..\..\..\..\..\Librarier\core\system.c</FilePath>
             </File>
+            <File>
+              <FileName>bt_code.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\core\bt_code.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
           <GroupName>main</GroupName>
           <Files>
             <File>
-              <FileName>bt_code.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\user\bt_code.c</FilePath>
-            </File>
-            <File>
               <FileName>main.c</FileName>
               <FileType>1</FileType>
               <FilePath>..\..\user\main.c</FilePath>
Index: USB/USB_HID/prj/GCC/c.bat
===================================================================
--- /YC3121_demo/ModuleDemo/USB/USB_HID/prj/GCC/c.bat	(nonexistent)
+++ /YC3121_demo/ModuleDemo/USB/USB_HID/prj/GCC/c.bat	(working copy)
@@ -0,0 +1,3 @@
+cls
+make clean
+make
\ No newline at end of file
Index: USB/USB_HID/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/USB/USB_HID/prj/GCC/makefile	(nonexistent)
+++ /YC3121_demo/ModuleDemo/USB/USB_HID/prj/GCC/makefile	(working copy)
@@ -0,0 +1,246 @@
+
+ifeq ($(OS),Windows_NT)
+DIR = C:/gcc-arm-none-eabi-7-2018-q2-update-win32
+else
+DIR = /usr/gcc-arm-none-eabi-7-2018-q2-update
+endif
+
+ARCH = $(DIR)/bin/arm-none-eabi
+GCC = $(ARCH)-gcc
+LD = $(ARCH)-ld
+AS = $(ARCH)-as
+OBJCOPY = $(ARCH)-objcopy
+OBJDUMP = "$(ARCH)-objdump"
+LIB_PATH = ../../../../../Librarier
+USER_PATH = ../../user
+
+
+all : output/out.hex
+
+
+CORE_OBJS =  $(LIB_PATH)/startup/flash_start_gcc \
+             $(LIB_PATH)/core/system \
+             $(LIB_PATH)/core/misc \
+             $(LIB_PATH)/core/bt_code \
+             $(LIB_PATH)/sdk/yc_gpio \
+             $(LIB_PATH)/sdk/yc_timer \
+             $(LIB_PATH)/sdk/yc_ipc \
+             $(LIB_PATH)/sdk/yc_uart \
+             $(LIB_PATH)/sdk/yc_usb/libraries/harward_Der/usb_core \
+             $(LIB_PATH)/sdk/yc_usb/libraries/harward_Der/Usb_dcd \
+             $(LIB_PATH)/sdk/yc_usb/libraries/harward_Der/Usb_dcd_init \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/core/usbd_core \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/core/usbd_ioreq \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/core/usbd_req \
+             $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/class/HID/usbd_hid_core \
+             $(LIB_PATH)/sdk/yc_usb/scpu_usb_hid_Device_Demo/usb_main \
+             $(LIB_PATH)/sdk/yc_usb/scpu_usb_hid_Device_Demo/usbd_desc \
+             $(LIB_PATH)/sdk/yc_usb/scpu_usb_hid_Device_Demo/usbd_usr \
+             ../../HalUSB/halUSB
+
+             
+USER_OBJS = $(USER_PATH)/main
+			
+OBJS = $(CORE_OBJS) $(USER_OBJS)
+
+INC_DIR = -I $(LIB_PATH)/core \
+          -I $(LIB_PATH)/sdk \
+          -I $(LIB_PATH)/sdk/yc_usb/libraries/harward_Der \
+          -I $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/core \
+          -I $(LIB_PATH)/sdk/yc_usb/libraries/SCPU_USB_Device_Library/class/HID \
+          -I $(LIB_PATH)/sdk/yc_usb/scpu_usb_hid_Device_Demo \
+          -I ../../HalUSB
+
+
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
+LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
+
+define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
+endef
+
+
+output/out.hex : output/out
+	$(OBJCOPY) $^ -O ihex $@
+
+
+output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
+	$(file >output/ld.script, $(ldscript))
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
+	$(OBJDUMP) -S $@ > output/disasm
+
+output/%.o : %.c
+	$(GCC) $< $(CFLAG) -o output/obj/$(notdir $@)
+
+output/%.o : %.s
+	$(AS) $^ -mthumb -mcpu=cortex-m0 -o output/obj/$(notdir $@)
+
+
+clean :
+ifeq ($(OS),Windows_NT)
+	del /Q output\*.*
+	del /Q output\obj\*.*
+else
+	rm -rf output/*
+	rm -rf output/obj/*
+endif
Index: USB/USB_HID/prj/MDK/YC3121_Keil.uvoptx
===================================================================
--- /YC3121_demo/ModuleDemo/USB/USB_HID/prj/MDK/YC3121_Keil.uvoptx	(revision 725)
+++ /YC3121_demo/ModuleDemo/USB/USB_HID/prj/MDK/YC3121_Keil.uvoptx	(working copy)
@@ -246,26 +246,26 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
-  </Group>
-
-  <Group>
-    <GroupName>main</GroupName>
-    <tvExp>1</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>2</GroupNumber>
+      <GroupNumber>1</GroupNumber>
       <FileNumber>3</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\user\bt_code.c</PathWithFileName>
+      <PathWithFileName>..\..\..\..\..\Librarier\core\bt_code.c</PathWithFileName>
       <FilenameWithoutPath>bt_code.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+  </Group>
+
+  <Group>
+    <GroupName>main</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>2</GroupNumber>
       <FileNumber>4</FileNumber>
Index: USB/USB_HID/prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/USB/USB_HID/prj/MDK/YC3121_Keil.uvprojx	(revision 725)
+++ /YC3121_demo/ModuleDemo/USB/USB_HID/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -184,6 +184,7 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>0</RvdsVP>
+            <RvdsMve>0</RvdsMve>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
@@ -391,17 +392,17 @@
               <FileType>1</FileType>
               <FilePath>..\..\..\..\..\Librarier\core\system.c</FilePath>
             </File>
+            <File>
+              <FileName>bt_code.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\..\Librarier\core\bt_code.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
           <GroupName>main</GroupName>
           <Files>
             <File>
-              <FileName>bt_code.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\..\user\bt_code.c</FilePath>
-            </File>
-            <File>
               <FileName>main.c</FileName>
               <FileType>1</FileType>
               <FilePath>..\..\user\main.c</FilePath>
Index: WDT/WDT_Interrupt/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/WDT/WDT_Interrupt/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/WDT/WDT_Interrupt/prj/GCC/makefile	(working copy)
@@ -27,8 +27,7 @@
 
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -36,22 +35,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -62,7 +209,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
Index: WDT/WDT_Reset/prj/GCC/makefile
===================================================================
--- /YC3121_demo/ModuleDemo/WDT/WDT_Reset/prj/GCC/makefile	(revision 723)
+++ /YC3121_demo/ModuleDemo/WDT/WDT_Reset/prj/GCC/makefile	(working copy)
@@ -27,8 +27,7 @@
 
 
              
-USER_OBJS = $(USER_PATH)/main \
-            $(USER_PATH)/bt_code
+USER_OBJS = $(USER_PATH)/main
 			
 OBJS = $(CORE_OBJS) $(USER_OBJS)
 
@@ -36,22 +35,170 @@
           -I $(LIB_PATH)/sdk
 
 
-CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder
+CFLAG =  -mthumb -mcpu=cortex-m0 -c -g -Os $(INC_DIR) $(DEF) -fno-toplevel-reorder -ffunction-sections -fdata-sections
 LDFLAG = -T output/ld.script -Map=output/memmap -lc -lm -lgcc -L "$(DIR)/lib/gcc/arm-none-eabi/7.3.1/thumb/v6-m"  -L "$(DIR)/arm-none-eabi/lib/thumb/v6-m"
 
 define ldscript = 
+/* Linker script to configure memory regions. 
+ * Need modifying for a specific board. 
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x1000000, LENGTH = 0x80000 /* 512K */
+  RAM (rwx) : ORIGIN = 0x20000, LENGTH = 0x10000 /* 64K */
+}
+
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ * 
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __copy_table_start__
+ *   __copy_table_end__
+ *   __zero_table_start__
+ *   __zero_table_end__
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
 SECTIONS
-{ 
-        . = 0x1000000;
-        .text : { *flash_start.o *(.text*) *(.rodata*) }
-        _sidata = ALIGN(4);
-        . = 0x20000;
-        .data : AT (_sidata) { _sdata = .; *(.data) _edata = .; }
-        .bss : { _sbss = .;     *(*.bss) *(*.scommon*) }
-        _ebss = .;
-        . = 0x30000;
-        _stack = .;
-        ASSERT(_ebss < _stack, "data size overflow")
+{
+	.text :
+	{
+		*flash_start*.o
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+	
+	
+
+	.ARM.extab : 
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+
+	 . = ALIGN(4);
+	__exidx_start = .;
+
+	__etext = .;
+		
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+	
+	.heap (COPY):
+	{
+		__end__ = .;
+		PROVIDE(end = .);
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+	
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
 }
 endef
 
@@ -62,7 +209,7 @@
 
 output/out : $(addprefix output/, $(addsuffix .o, $(OBJS)))
 	$(file >output/ld.script, $(ldscript))
-	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@  $(LDFLAG)
+	$(LD) $(addprefix output/obj/,$(addsuffix .o, $(notdir $(OBJS)))) -o $@ $(LDFLAG)
 	$(OBJDUMP) -S $@ > output/disasm
 
 output/%.o : %.c
