Index: yc_bt.h
===================================================================
--- /YC3121_SDK/fw/sdk/yc_bt.h	(revision 809)
+++ /YC3121_SDK/fw/sdk/yc_bt.h	(working copy)
@@ -570,7 +570,13 @@
   */
 Boolean BT_Init(void);
 
-
+/**
+  * @brief  BT_WakeupInit (M0 Sleep,Bt lpm Sleep)
+  * @param  none
+  * @retval TRUE:success
+  *         FALSE:fail
+  */
+Boolean BT_WakeupInit(void);
 
 /**
   * @brief  DNS(domain name resolution)
Index: yc_bt.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_bt.c	(revision 809)
+++ /YC3121_SDK/fw/sdk/yc_bt.c	(working copy)
@@ -21,6 +21,7 @@
 
 extern IPC_TypeDef *IpcTx;
 extern IPC_TypeDef *IpcRx;
+extern uint8_t bt_lpm_mode;
 
 HCI_TypeDef hci_bt;
 
@@ -138,7 +139,6 @@
 	return TRUE;
 }
 
-
 Boolean BT_Init()
 {
 	BluetoothBuf.BufSize =  BT_BUFSIZE;
@@ -154,13 +154,30 @@
 	for(i=0;i<5;i++)	CmdRepData[i]=0;
 	for(i=0;i<BT_BUFSIZE;i++)	rcvbuf[i]=0;
 	hci_bt.p_data =  ipcrecbuf;
-	IpcInit();
+    IpcInit();
 	#ifdef BT_ERROR_LOG
 	MyPrintf("BT_Init end\n");
 	#endif
 	return TRUE;
 }
 
+Boolean BT_WakeupInit()
+{
+   	BluetoothBuf.BufSize =  BT_BUFSIZE;
+	BluetoothBuf.pBuf = rcvbuf;
+	BluetoothBuf.count = 0;
+	BluetoothBuf.ReadIndex = 0;
+	BluetoothBuf.WriteIndex =0;
+    hci_bt.p_data =  ipcrecbuf;
+    enable_intr(INTR_BT);
+    bt_lpm_mode = 1;
+    BT_SetLpmMode(0x00);
+    #ifdef BT_ERROR_LOG
+	MyPrintf("BT_Wakeup Init end\n");
+	#endif
+    return TRUE;
+}
+
 static uint8_t GetData(Boolean UpdataAnalyzeIndex)
 {
 	uint8_t TempData;
@@ -493,7 +510,6 @@
 	return TRUE;
 }
 
-extern uint8_t bt_lpm_mode;
 Boolean BT_SetLpmMode(uint8_t mode)
 {
 	HCI_TypeDef msg;
Index: yc_lpm.h
===================================================================
--- /YC3121_SDK/fw/sdk/yc_lpm.h	(revision 809)
+++ /YC3121_SDK/fw/sdk/yc_lpm.h	(working copy)
@@ -52,19 +52,20 @@
   */
 void Chip_Speedstep(void);
 
+
 /*
  * @brief:  lpm_sleep config
  * @param:  time: RTC wakeup time (unit:second)
- * @param:  GPIOx
- * @param:  GPIO_Pin
+ * @param:  GPIO_Pin0_Pin31      GPIOGROUPA&GPIOGROUPB
+ * @param:  GPIO_Pin32_Pin47     GPIOGROUPC
  * @param:  islow_wakeup:	0:High level wakeup
- *                        1:LOW  level wakeup
+ *                          1:LOW  level wakeup
  * @param:  is_powerdownbt:	0: diseable bt sleep
  *                          1: enable bt sleep
  * @param:  tmp: BT_Hibernate return or 0
  * @return: none
  */
-void CM0_Sleep(uint32_t time, GPIO_TypeDef GPIOx, uint16_t GPIO_Pin, uint8_t islow_wakeup, uint8_t is_powerdownbt);
+void CM0_Sleep(uint32_t time, uint32_t GPIO_Pin0_Pin31, uint16_t GPIO_Pin32_Pin47, uint8_t islow_wakeup, uint8_t is_powerdownbt);
 
 /*
  * @brief: GPIO32(GPIOC GPIO_Pin_0) enable
Index: yc_lpm.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_lpm.c	(revision 809)
+++ /YC3121_SDK/fw/sdk/yc_lpm.c	(working copy)
@@ -143,18 +143,18 @@
     SYSCTRL_HCLKConfig(SYSCTRL_HCLK_Div8);
 }
 
-void CM0_Sleep(uint32_t time, GPIO_TypeDef GPIOx, uint16_t GPIO_Pin, uint8_t islow_wakeup, uint8_t is_powerdownbt)
+void CM0_Sleep(uint32_t time, uint32_t GPIO_Pin0_Pin31, uint16_t GPIO_Pin32_Pin47, uint8_t islow_wakeup, uint8_t is_powerdownbt)
 {
     uint32_t temp;
 
     SYSCTRL_AHBPeriphClockCmd(SYSCTRL_AHBPeriph_INTR | SYSCTRL_AHBPeriph_SHA | \
-                              SYSCTRL_AHBPeriph_CRC | SYSCTRL_AHBPeriph_PWM | \
-                              SYSCTRL_AHBPeriph_WDT | SYSCTRL_AHBPeriph_USB | \
-                              SYSCTRL_AHBPeriph_SPI | SYSCTRL_AHBPeriph_DES | \
-                              SYSCTRL_AHBPeriph_RSA | SYSCTRL_AHBPeriph_ASE | \
-                              SYSCTRL_AHBPeriph_7816 | SYSCTRL_AHBPeriph_SM4 | \
-                              SYSCTRL_AHBPeriph_7811 | SYSCTRL_AHBPeriph_ADC7811 | \
-                              SYSCTRL_AHBPeriph_CP, DISABLE);
+                            SYSCTRL_AHBPeriph_CRC | SYSCTRL_AHBPeriph_PWM | \
+                            SYSCTRL_AHBPeriph_WDT | SYSCTRL_AHBPeriph_USB | \
+                            SYSCTRL_AHBPeriph_SPI | SYSCTRL_AHBPeriph_DES | \
+                            SYSCTRL_AHBPeriph_RSA | SYSCTRL_AHBPeriph_ASE | \
+                            SYSCTRL_AHBPeriph_7816 | SYSCTRL_AHBPeriph_SM4 | \
+                            SYSCTRL_AHBPeriph_7811 | SYSCTRL_AHBPeriph_ADC7811 | \
+                            SYSCTRL_AHBPeriph_CP, DISABLE);
 
     //DISABLE RTC WAKEUP
     setlpmval(LPM_GPIO_WKHI, 17, 1, 0);
@@ -163,26 +163,30 @@
     setlpmval(LPM_GPIO_WKHI, 18, 1, islow_wakeup ? 1 : 0);
 
     //set gpio num
-    if (islow_wakeup)
+    if(GPIO_Pin0_Pin31!=0 || GPIO_Pin32_Pin47!=0)
     {
-        GPIO_Config(GPIOx, GPIO_Pin, PULL_UP);
-    }
-    else
-    {
-        GPIO_Config(GPIOx, GPIO_Pin, PULL_DOWN);
-    }
-
-    if (GPIOx == GPIOA)
-    {
-        setlpmval(LPM_GPIO_WKUP, 0, 16, GPIO_Pin);
-    }
-    else if (GPIOx == GPIOB)
-    {
-        setlpmval(LPM_GPIO_WKUP, 16, 16, GPIO_Pin);
-    }
-    else if (GPIOx == GPIOC)
-    {
-        setlpmval(LPM_GPIO_WKHI, 0, 16, GPIO_Pin);
+        for(int i = 0;i < 32;i++)
+        {
+            if((GPIO_Pin0_Pin31 & (1<<i)) != 0)
+            {
+                if (islow_wakeup)
+                    GPIO_CONFIG(i) = PULL_UP;
+                else
+                    GPIO_CONFIG(i) = PULL_DOWN;
+            }
+        }
+        for(int i = 0;i<16;i++)
+        {
+            if((GPIO_Pin32_Pin47 & (1<<i)) != 0)
+            {
+                if (islow_wakeup)
+                    GPIO_CONFIG(i+32) = PULL_UP;
+                else
+                    GPIO_CONFIG(i+32) = PULL_DOWN;
+            }
+        }
+        setlpmval(LPM_GPIO_WKUP, 0, 32, GPIO_Pin0_Pin31);
+        setlpmval(LPM_GPIO_WKHI, 0, 16, GPIO_Pin32_Pin47);
     }
     else
     {
