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,42 +139,58 @@
 	return TRUE;
 }
 
-
 Boolean BT_Init()
 {
-	BluetoothBuf.BufSize =  BT_BUFSIZE;
-	BluetoothBuf.pBuf = rcvbuf;
-	BluetoothBuf.count = 0;
-	BluetoothBuf.ReadIndex = 0;
-	BluetoothBuf.WriteIndex =0;
-	HCI_CMD_BIT_FLAG[0]=0;//全局变量问题优化
-	HCI_CMD_BIT_FLAG[1]=0;
-	StartTick=0;
-	PacketNum=0;
-	int i;
-	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();
-	#ifdef BT_ERROR_LOG
-	MyPrintf("BT_Init end\n");
-	#endif
-	return TRUE;
+    BluetoothBuf.BufSize =  BT_BUFSIZE;
+    BluetoothBuf.pBuf = rcvbuf;
+    BluetoothBuf.count = 0;
+    BluetoothBuf.ReadIndex = 0;
+    BluetoothBuf.WriteIndex =0;
+    HCI_CMD_BIT_FLAG[0]=0;//全局变量问题优化
+    HCI_CMD_BIT_FLAG[1]=0;
+    StartTick=0;
+    PacketNum=0;
+    int i;
+    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();
+    #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;
-	TempData=BluetoothBuf.pBuf[BluetoothBuf.ReadIndex];
-	if(UpdataAnalyzeIndex)
-	{
-		NVIC_DisableIRQ(BT_IRQn);
-		BluetoothBuf.count--;
-		NVIC_EnableIRQ(BT_IRQn);
-		BluetoothBuf.ReadIndex++;
-		if(BluetoothBuf.ReadIndex>=BluetoothBuf.BufSize)	BluetoothBuf.ReadIndex=0;
-	}
-	return TempData;
+    uint8_t TempData;
+    TempData=BluetoothBuf.pBuf[BluetoothBuf.ReadIndex];
+    if(UpdataAnalyzeIndex)
+    {
+        NVIC_DisableIRQ(BT_IRQn);
+        BluetoothBuf.count--;
+        NVIC_EnableIRQ(BT_IRQn);
+        BluetoothBuf.ReadIndex++;
+        if(BluetoothBuf.ReadIndex>=BluetoothBuf.BufSize)	BluetoothBuf.ReadIndex=0;
+    }
+    return TempData;
 }
 
 
@@ -196,149 +213,149 @@
 }
 Boolean BT_SetBtAddr(uint8_t *bt_addr)
 {
-	HCI_TypeDef msg;
-	msg.opcode = HCI_CMD_SET_BT_ADDR;
-	msg.DataLen = 6;
-	msg.p_data = bt_addr;
-	BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SET_BT_ADDR);
-  SendCMD(&msg);
-  StartTick=SysTick_GetTick();
-  do
-  {
+    HCI_TypeDef msg;
+    msg.opcode = HCI_CMD_SET_BT_ADDR;
+    msg.DataLen = 6;
+    msg.p_data = bt_addr;
+    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SET_BT_ADDR);
+    SendCMD(&msg);
+    StartTick=SysTick_GetTick();
+    do
+    {
 		if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SET_BT_ADDR))
 		{
 			return TRUE;
 		}
-  }while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));//ms
-	return FALSE;
+    }while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));//ms
+    return FALSE;
 }
 
 
 Boolean BT_SetBleAddr(uint8_t * bt_addr)
 {
-	HCI_TypeDef msg;
-	msg.opcode = HCI_CMD_SET_BLE_ADDR;
-	msg.DataLen = 6;
-	msg.p_data = bt_addr;
-	BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SET_BLE_ADDR);
-	SendCMD(&msg);
-	StartTick=SysTick_GetTick();
-	do
-	{
-		if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SET_BLE_ADDR))
-		{
-			return TRUE;
-		}
-	}  while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));//ms
-	return FALSE;
+    HCI_TypeDef msg;
+    msg.opcode = HCI_CMD_SET_BLE_ADDR;
+    msg.DataLen = 6;
+    msg.p_data = bt_addr;
+    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SET_BLE_ADDR);
+    SendCMD(&msg);
+    StartTick=SysTick_GetTick();
+    do
+    {
+        if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SET_BLE_ADDR))
+        {
+            return TRUE;
+        }
+    }  while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));//ms
+    return FALSE;
 }
 
 Boolean BT_SetVisibility(Boolean bt_discoverable, Boolean bt_connectability, Boolean ble_discoverable)
 {
-	HCI_TypeDef msg;
-	uint8_t visibility_data = 0;
-	if (bt_discoverable == 1)
-		visibility_data = visibility_data | 0x01;
-	if (bt_connectability == 1)
-		visibility_data = visibility_data | 0x02;
-	if (ble_discoverable == 1)
-		visibility_data = visibility_data | 0x04;
-
-	msg.opcode = HCI_CMD_SET_VISIBILITY;
-	msg.DataLen = 0x01;
-	msg.p_data = &visibility_data;
-	BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SET_VISIBILITY);
-	SendCMD(&msg);
-	StartTick=SysTick_GetTick();
-	do
-	{
-		if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SET_VISIBILITY))
-		{
-			return TRUE;
-		}
-	}  while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));
-	return FALSE;
+    HCI_TypeDef msg;
+    uint8_t visibility_data = 0;
+    if (bt_discoverable == 1)
+        visibility_data = visibility_data | 0x01;
+    if (bt_connectability == 1)
+        visibility_data = visibility_data | 0x02;
+    if (ble_discoverable == 1)
+        visibility_data = visibility_data | 0x04;
+
+    msg.opcode = HCI_CMD_SET_VISIBILITY;
+    msg.DataLen = 0x01;
+    msg.p_data = &visibility_data;
+    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SET_VISIBILITY);
+    SendCMD(&msg);
+    StartTick=SysTick_GetTick();
+    do
+    {
+        if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SET_VISIBILITY))
+        {
+            return TRUE;
+        }
+    }  while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));
+    return FALSE;
 }
 
 Boolean BT_SetBtName(uint8_t * bt_name, uint16_t name_len)
 {
-	HCI_TypeDef msg;
-	msg.opcode = HCI_CMD_SET_BT_NAME;
-	msg.DataLen = name_len;
-	msg.p_data  = bt_name;
-	BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SET_BT_NAME);
-	SendCMD(&msg);
-	StartTick=SysTick_GetTick();
-	do
-	{
-		if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SET_BT_NAME))
-		{
-    		return TRUE;
-		}
-  }  while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));
-	return FALSE;
+    HCI_TypeDef msg;
+    msg.opcode = HCI_CMD_SET_BT_NAME;
+    msg.DataLen = name_len;
+    msg.p_data  = bt_name;
+    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SET_BT_NAME);
+    SendCMD(&msg);
+    StartTick=SysTick_GetTick();
+    do
+	{
+        if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SET_BT_NAME))
+        {
+            return TRUE;
+        }
+    }  while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));
+    return FALSE;
 }
 
 
 Boolean BT_SetBleName(uint8_t* ble_name, uint16_t name_len)
 {
-	HCI_TypeDef msg;
-	msg.opcode = HCI_CMD_SET_BLE_NAME;
-	msg.DataLen = name_len;
-	msg.p_data  = ble_name;
-	BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SET_BLE_NAME);
-	SendCMD(&msg);
-	StartTick=SysTick_GetTick();
-	do
-	{
-		if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SET_BLE_NAME))
-		{
-			return TRUE;
-		}
-	}  while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));
-	return FALSE;
+    HCI_TypeDef msg;
+    msg.opcode = HCI_CMD_SET_BLE_NAME;
+    msg.DataLen = name_len;
+    msg.p_data  = ble_name;
+    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SET_BLE_NAME);
+    SendCMD(&msg);
+    StartTick=SysTick_GetTick();
+    do
+    {
+        if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SET_BLE_NAME))
+        {
+            return TRUE;
+        }
+    }  while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));
+    return FALSE;
 }
 
 
 Boolean BT_SendSppData(uint8_t * spp_data, uint16_t DataLen)
 {
-	if(DataLen==0||DataLen>MAX_BLUETOOTH_DATA_LEN)	return FALSE;
-	HCI_TypeDef msg;
-	msg.opcode = HCI_CMD_SEND_SPP_DATA;
-	msg.DataLen = DataLen;
-	msg.p_data = spp_data;
-	BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SEND_SPP_DATA);
-	SendCMD(&msg);
-	StartTick=SysTick_GetTick();
-	do
-	{
-		if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SEND_SPP_DATA))
-		{
-			return TRUE;
-		}
-	}  while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));
-	return FALSE;
+    if(DataLen==0||DataLen>MAX_BLUETOOTH_DATA_LEN)	return FALSE;
+    HCI_TypeDef msg;
+    msg.opcode = HCI_CMD_SEND_SPP_DATA;
+    msg.DataLen = DataLen;
+    msg.p_data = spp_data;
+    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SEND_SPP_DATA);
+    SendCMD(&msg);
+    StartTick=SysTick_GetTick();
+    do
+    {
+        if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SEND_SPP_DATA))
+        {
+            return TRUE;
+        }
+    }  while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));
+    return FALSE;
 }
 
 Boolean BT_SendBleData(uint8_t * ble_data, uint16_t DataLen)
 {
-	if(DataLen<2||DataLen>MAX_BLUETOOTH_DATA_LEN)	return FALSE;
-	HCI_TypeDef msg;
-	msg.opcode = HCI_CMD_SEND_BLE_DATA;
-	msg.DataLen = DataLen;
-
-	msg.p_data = ble_data;
-	BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SEND_BLE_DATA);
-	SendCMD(&msg);
-	StartTick=SysTick_GetTick();
-	do
-	{
-		if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SEND_BLE_DATA))
-		{
-			return TRUE;
-		}
-	}  while(!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
-	return FALSE;
+    if(DataLen<2||DataLen>MAX_BLUETOOTH_DATA_LEN)	return FALSE;
+    HCI_TypeDef msg;
+    msg.opcode = HCI_CMD_SEND_BLE_DATA;
+    msg.DataLen = DataLen;
+
+    msg.p_data = ble_data;
+    BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_SEND_BLE_DATA);
+    SendCMD(&msg);
+    StartTick=SysTick_GetTick();
+    do
+    {
+        if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_SEND_BLE_DATA))
+        {
+            return TRUE;
+        }
+    }  while(!SysTick_IsTimeOut(StartTick, BTTIMEOUT));
+    return FALSE;
 }
 
 
@@ -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
     {
