Index: fw/sdk/yc_bt.h
===================================================================
--- /YC3121_SDK/fw/sdk/yc_bt.h	(revision 710)
+++ /YC3121_SDK/fw/sdk/yc_bt.h	(working copy)
@@ -20,6 +20,8 @@
 #define HCI_CMD		              0x01
 #define HCI_EVENT               0x02
 #define MAX_BLUETOOTH_DATA_LEN	255
+#define MAX_TCP_DATA_LEN				235
+#define MAX_BIG_DATA_LEN				1460
 
 
 
@@ -60,8 +62,12 @@
 #define BIT_DNS_REQ                       33
 #define BIT_CONNECT_BNEP                  34
 #define BIT_CONNECT_TCP                   35
-#define BIT_BNEP_SEND_TCPDATA             36
+#define BIT_BNEP_SEND_TCP_DATA            36
 #define BIT_DISCONNECT_TCP                37
+#define BIT_BNEP_SEND_UDP_DATA            38
+#define BIT_BNEP_SEND_TCP_BIG_DATA        39
+#define BIT_BNEP_SEND_TCP_BIG_DATA_FINISH 40
+#define BIT_BNEP_SEND_TCP_BIG_DATA_STATUS 41
 /*CMD*/
 #define HCI_CMD_SET_BT_ADDR               0x00  //设置 BT3.0 地址
 #define HCI_CMD_SET_BLE_ADDR              0x01  //设置 BLE 地址
@@ -98,6 +104,8 @@
 #define HCI_CMD_DISCONNECT_TCP            0x80 //断开TCP连接
 #define HCI_CMD_BNEP_SEND_TCP_DATA        0x81 //发送TCP数据
 #define HCI_CMD_DNS_REQ                   0x82 //域名解析指令
+#define HCI_CMD_SEND_UDP_DATA             0x84 //发送UDP数据
+#define HCI_CMD_SEND_BIG_DATA             0x85 //发送TCP大包数据
 
 
 /*EVENT*/
@@ -126,6 +134,12 @@
 #define HCI_EVENT_TCP_CONNECT_LOG         0x33  /*TCP连接LOG*/
 #define HCI_EVENT_BNEP_CHIP_ERROR         0x34  /*芯片不支持BNEP*/
 #define HCI_EVENT_DNS_RSP                 0x35  /*DNS返回的ip地址*/
+#define HCI_EVENT_BB_DISCONNECT           0x36  /*经典蓝牙baseband断开后返回的事件*/
+#define HCI_EVENT_BT_NAME           			0x37  /*BT master name*/
+#define HCI_EVENT_UDP_INFO           			0x38  /*UDP信息头,包含远端IP、本地IP、远端端口、本地端口,后面会紧随一包UDP数据*/
+#define HCI_EVENT_BNEP_RECEIVE_UDP_DATA   0x39  /*接收到UDP数据*/
+#define HCI_EVENT_BIG_DATA_FINISH   			0x3a  /*大数据分包发送完成事件*/
+#define HCI_EVENT_BIG_DATA_STATUS   			0x3b  /*大数据分包发送状态*/
 
 
 /** 
@@ -133,53 +147,33 @@
   */ 
 typedef enum
 {
-	BT_CONNECTED        = HCI_EVENT_BT_CONNECTED,
-	BLE_CONNECTED       = HCI_EVENT_BLE_CONNECTED,
-	BT_DISCONNECTED     = HCI_EVENT_BT_DISCONNECTED,
-	BLE_DISCONNECTED    = HCI_EVENT_BLE_DISCONNECTED,
-	BT_DATA             =HCI_EVENT_SPP_DATA_RECEIVED,
-	BLE_DATA            =HCI_EVENT_BLE_DATA_RECEIVED,
-	NVRAM_DATA          =HCI_EVENT_NVRAM_CHANGED,
-	CONFIRM_GKEY        =HCI_EVENT_GKEY,
-	PASSKEY             =HCI_EVENT_GET_PASSKEY,
-	PAIRING_COMPLETED   =HCI_EVENT_PAIRING_COMPLETED,
-	BNEP_CONNECT        =HCI_EVENT_BNEP_CONNECT,
-	TCP_CONNECT         =HCI_EVENT_TCP_CONNECT,
-	BNEP_RECEIVE_TCP_DATA = HCI_EVENT_BNEP_RECEIVE_TCP_DATA,
-	TCP_DISCONNECT       =HCI_EVENT_TCP_DISCONNECT,
-	BNEP_DISCONNECT      = HCI_EVENT_BNEP_DISCONNECT,
-	BNEP_CONNECT_FAIL    =HCI_EVENT_BNEP_CONNECT_FAIL,
-	TCP_FAIL             =HCI_EVNET_TCP_FAIL,
-	TCP_CONNECT_LOG      =HCI_EVENT_TCP_CONNECT_LOG,
-	BNEP_CHIP_ERROR      =HCI_EVENT_BNEP_CHIP_ERROR,
-	DNS_RSP              =HCI_EVENT_DNS_RSP
+	BT_CONNECTED        		=HCI_EVENT_BT_CONNECTED,
+	BLE_CONNECTED       		=HCI_EVENT_BLE_CONNECTED,
+	BT_DISCONNECTED     		=HCI_EVENT_BT_DISCONNECTED,
+	BLE_DISCONNECTED    		=HCI_EVENT_BLE_DISCONNECTED,
+	BT_DATA             		=HCI_EVENT_SPP_DATA_RECEIVED,
+	BLE_DATA            		=HCI_EVENT_BLE_DATA_RECEIVED,
+	NVRAM_DATA          		=HCI_EVENT_NVRAM_CHANGED,
+	CONFIRM_GKEY        		=HCI_EVENT_GKEY,
+	PASSKEY             		=HCI_EVENT_GET_PASSKEY,
+	PAIRING_COMPLETED   		=HCI_EVENT_PAIRING_COMPLETED,
+	BNEP_CONNECT        		=HCI_EVENT_BNEP_CONNECT,
+	TCP_CONNECT         		=HCI_EVENT_TCP_CONNECT,
+	BNEP_RECEIVE_TCP_DATA		=HCI_EVENT_BNEP_RECEIVE_TCP_DATA,
+	TCP_DISCONNECT       		=HCI_EVENT_TCP_DISCONNECT,
+	BNEP_DISCONNECT      		=HCI_EVENT_BNEP_DISCONNECT,
+	BNEP_CONNECT_FAIL    		=HCI_EVENT_BNEP_CONNECT_FAIL,
+	TCP_FAIL             		=HCI_EVNET_TCP_FAIL,
+	TCP_CONNECT_LOG      		=HCI_EVENT_TCP_CONNECT_LOG,
+	BNEP_CHIP_ERROR      		=HCI_EVENT_BNEP_CHIP_ERROR,
+	DNS_RSP              		=HCI_EVENT_DNS_RSP,
+	BB_DISCONNECT						=HCI_EVENT_BB_DISCONNECT,
+	BT_NAME									=HCI_EVENT_BT_NAME,
+	UDP_INFO								=HCI_EVENT_UDP_INFO,
+	BNEP_RECEIVE_UDP_DATA		=HCI_EVENT_BNEP_RECEIVE_UDP_DATA
+	
 }BT_EventCodeEnum;
 
-typedef enum
-{
-BNEP_CONNECT_TIMEOUT,
-MOBILE_PHONE_NOT_SUPPORTED_BNEP,
-LINKKLY_ERROR,
-ROLE_SWITCH_FAIL
-}Bnep_Connect_Fail_Reason;
-
-typedef enum
-{
-TCP_CONNECT_TIMEOUT,
-DNS_NO_ACK,
-IP_ERROR,
-DISCONNECT_TIMEOUT,
-RECEIVER_TCP_RST
-}Tcp_Connect_Fail_Reason;
-
-typedef enum
-{
-RECIEVE_DHCP_OFFER=0X01,
-RECIEVE_DHCP_ACK=0X03,
-RECIEVE_ARP_RESPONSE=0X05,
-RECIEVE_DNS_RESPONSE=0X07,
-RECIEVE_TCP_SYN_ACK=0X09
-}Tcp_Connect_Log;
 
 
 typedef struct 
@@ -484,11 +478,11 @@
 /**
   * @brief  add ble custom Service
   * @param  ble_service_uuid:
-	*														byte0£º uuid length(2 or 16)
+	*														byte0: uuid length(2 or 16)
 	*														byte1-2(16): uuid
 	*					service_uuid_len: sizeof(ble_service_uuid)
-  * @retval TRUE:success.
-  *         FALSE:failed
+  * @retval 0:failed
+  *         other:Service handle
   */
 uint16_t BT_AddBleService(uint8_t* ble_service_uuid, uint16_t service_uuid_len);
 
@@ -510,8 +504,8 @@
 	*														byte4(18):	write/read payload length(1--20;default:1)
 	*														byte5(19)-x:write/read payload(default:00)
 	*					service_Characteristic_payload_len: sizeof(ble_Characteristic_uuid)
-  * @retval TRUE:success.
-  *         FALSE:failed
+  * @retval 0:failed
+  *         other:Characteristic handle
   */
 uint16_t BT_AddBleCharacteristic(uint8_t* ble_Characteristic_uuid, uint16_t service_Characteristic_payload_len);
 
@@ -569,7 +563,7 @@
 /**
   * @brief  DNS(domain name resolution)
   * @param  dns_data: pointer to  domain name(www.baidu.com).
-            DataLen: data length(max 49 bytes)
+            DataLen: data length(max 62 bytes)
   * @retval TRUE:success
   *         FALSE:fail
   */
@@ -613,15 +607,41 @@
 /**
   * @brief  Send  TcpData
   * @param  tcpdata: pointer to  tcpdata.
-	          Byte0  TCP connect handle
-						Byte1~ByteN  The TCP data you want to send
-            len: data length(max 251 bytes)
+	          Byte0  TCP handle
+						Byte1~ByteN  The TCP data need to send(max 235 bytes)
+            len: data length(max value 1+235)
   * @retval TRUE:success
   *         FALSE:fail
   */
 Boolean BT_BnepSendTcpData( uint8_t *tcpdata,int len);
 
 
+/**
+  * @brief  Send  Tcp big packet Data
+  * @param  tcpdata: pointer to  tcpdata.
+	          Byte0  TCP handle
+						Byte1~ByteN  The TCP data need to send(max 1460 bytes)
+            len: data length(max value 1+1460)
+  * @retval TRUE:success
+  *         FALSE:fail
+  */
+Boolean BT_BnepSendTcpBigData( uint8_t *tcpdata,int len);
+
+
+/**
+  * @brief  Send  UDP Data
+  * @param  tcpdata: pointer to  udpdata.
+	          Byte0~Byte3  UDP remote IP(192.168.1.1 is c0 a8 01 01)
+						Byte4~Byte5  UDP local port(8888 is 22 b8)
+						Byte6~Byte7  UDP remote port(12345 is 30 39)
+						Byte8~ByteN  The UDP data need to send(max 247 bytes)
+            len: data length(max value 255)
+  * @retval TRUE:success
+  *         FALSE:fail
+  */
+Boolean BT_BnepSendUdpData( uint8_t *udpdata,int len);
+
+
 
 /**
   * @brief  Disconnect  Tcp
Index: fw/sdk/yc_bt.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_bt.c	(revision 710)
+++ /YC3121_SDK/fw/sdk/yc_bt.c	(working copy)
@@ -5,7 +5,7 @@
 static tick StartTick;
 static uint32_t HCI_CMD_BIT_FLAG[2]={0};
 #define BTTIMEOUT 500
-#define BT_BUFSIZE 1024
+#define BT_BUFSIZE 2048
 uint8_t rcvbuf[BT_BUFSIZE]={0};
 extern uint8_t ipcrecbuf[IPCREVSIZE];
 
@@ -64,23 +64,12 @@
 static void SaveData(uint8_t* data,int len)
 {
 	int i;
-	if(BluetoothBuf.count+len>=BluetoothBuf.BufSize)//如果buffer满了则延时等待，每次等待100ms，三次等待还是满的就进assert
+	if(BluetoothBuf.count+len>BluetoothBuf.BufSize)
 	{
-		int WaitTimes=0;
-		while(1)
-		{
-			delay_ms(100);
-			WaitTimes++;
-			if(BluetoothBuf.count<BluetoothBuf.BufSize)
-			{
-				break;
-			}
-			else if(WaitTimes>=3)
-			{
-				_ASSERT(1);
-				return;
-			}
-		}
+		#ifdef SDK_DEBUG
+		MyPrintf("BluetoothBuf full\r\n");
+		#endif
+		return;
 	}
 	for(i=0;i<len;i++)
 	{
@@ -92,7 +81,7 @@
 }
 
 //#define PrintLog
-#define DOMAIN_MAX_LEN	49
+#define DOMAIN_MAX_LEN	62
 Boolean BNEP_DomainConvert(unsigned char * domainString, unsigned char domainStringLen, unsigned char *newDomainString,int* newDomainStringIndex)
 {
 	#ifdef PrintLog
@@ -300,7 +289,7 @@
 
 Boolean BT_SendSppData(uint8_t * spp_data, uint16_t DataLen)
 {
-	_ASSERT(DataLen>0);
+	if(DataLen==0||DataLen>MAX_BLUETOOTH_DATA_LEN)	return FALSE;
 	HCI_TypeDef msg;
 	msg.opcode = HCI_CMD_SEND_SPP_DATA;
 	msg.DataLen = DataLen;
@@ -320,7 +309,7 @@
 
 Boolean BT_SendBleData(uint8_t * ble_data, uint16_t DataLen)
 {
-	//_ASSERT(DataLen != 0);
+	if(DataLen<2||DataLen>MAX_BLUETOOTH_DATA_LEN)	return FALSE;
 	HCI_TypeDef msg;
 	msg.opcode = HCI_CMD_SEND_BLE_DATA;
 	msg.DataLen = DataLen;
@@ -859,16 +848,105 @@
 
 Boolean BT_BnepSendTcpData( uint8_t *tcpdata,int len)
 {
+	if((len-1)>MAX_TCP_DATA_LEN)	return FALSE;
 	HCI_TypeDef msg;
 	msg.opcode = HCI_CMD_BNEP_SEND_TCP_DATA;
 	msg.DataLen = len;
 	msg.p_data = tcpdata;
-	BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCPDATA);
+	BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCP_DATA);
+  SendCMD(&msg);
+  StartTick=SysTick_GetTick();
+  do
+  {
+		if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCP_DATA))
+		{
+			return TRUE;
+		}
+  }while(!SysTick_IsTimeOut(StartTick,BTTIMEOUT));//ms
+	return FALSE;
+}
+
+#define BIG_DATA_HEAD_LEN	5
+Boolean BT_BnepSendTcpBigData( uint8_t *tcpdata,int len)
+{
+	if((len-1)>MAX_BIG_DATA_LEN)	return FALSE;
+	HCI_TypeDef msg;
+	msg.opcode = HCI_CMD_SEND_BIG_DATA;
+	int sendedLen=0;
+	int packetLen;
+	uint8_t firstPacketData[MAX_BLUETOOTH_DATA_LEN];
+	BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCP_BIG_DATA_FINISH);
+	BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCP_BIG_DATA_STATUS);
+	while(sendedLen<(len-1))
+	{
+		if(sendedLen==0)
+		{
+			packetLen=(len-1)>(MAX_BLUETOOTH_DATA_LEN-BIG_DATA_HEAD_LEN)?(MAX_BLUETOOTH_DATA_LEN-BIG_DATA_HEAD_LEN):(len-1);
+			msg.DataLen=packetLen+BIG_DATA_HEAD_LEN;
+			firstPacketData[0]=tcpdata[0];//handle
+			
+			firstPacketData[1]=((len-1)&0xff);
+			firstPacketData[2]=(((len-1)>>8)&0xff);//big packet len
+			
+			firstPacketData[3]=0;
+			firstPacketData[4]=0;//reserved
+			memcpy((uint8_t*)&firstPacketData[5],(uint8_t*)&tcpdata[1],packetLen);
+			msg.p_data = firstPacketData;
+		}
+		else
+		{
+			packetLen=((len-1)-sendedLen)>MAX_BLUETOOTH_DATA_LEN?MAX_BLUETOOTH_DATA_LEN:((len-1)-sendedLen);
+			msg.DataLen=packetLen;
+			msg.p_data =(uint8_t*)&tcpdata[sendedLen+1];
+		}
+
+		BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCP_BIG_DATA);
+		SendCMD(&msg);
+		StartTick=SysTick_GetTick();
+		while(!BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCP_BIG_DATA))
+		{
+			if(SysTick_IsTimeOut(StartTick,BTTIMEOUT))
+			{
+				return FALSE;
+			}
+		}
+		sendedLen +=packetLen;
+	}
+	//wait big data finish
+	StartTick=SysTick_GetTick();
+	while(!BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCP_BIG_DATA_FINISH))
+	{
+		if(SysTick_IsTimeOut(StartTick,BTTIMEOUT))
+		{
+			return FALSE;
+		}
+	}
+	//wait big data status
+	StartTick=SysTick_GetTick();
+	while(!BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCP_BIG_DATA_STATUS))
+	{
+		if(SysTick_IsTimeOut(StartTick,BTTIMEOUT))
+		{
+			return FALSE;
+		}
+	}
+	return TRUE;
+}
+
+
+Boolean BT_BnepSendUdpData( uint8_t *udpdata,int len)
+{
+	if(len<8||len>MAX_BLUETOOTH_DATA_LEN)	return FALSE;
+	HCI_TypeDef msg;
+	msg.opcode = HCI_CMD_SEND_UDP_DATA;
+	msg.DataLen = len;
+	msg.p_data = udpdata;
+	BT_BIT_CLEAR(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_UDP_DATA);
   SendCMD(&msg);
   StartTick=SysTick_GetTick();
   do
   {
-		if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCPDATA))
+		if(BT_BIT_GET(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_UDP_DATA))
 		{
 			return TRUE;
 		}
@@ -940,6 +1018,13 @@
 					PacketNum++;
 					break;
 				
+				case HCI_EVENT_BNEP_RECEIVE_UDP_DATA:
+//					SaveData((uint8_t *)&hci_bt,hci_bt.DataLen+3);
+					SaveData((uint8_t*)&hci_bt,3);
+					SaveData(hci_bt.p_data,hci_bt.DataLen);												
+					PacketNum++;
+					break;
+				
 				case HCI_EVENT_BT_CONNECTED:
 				case HCI_EVENT_BLE_CONNECTED:
 				case HCI_EVENT_GKEY:
@@ -957,6 +1042,10 @@
 				case HCI_EVENT_TCP_CONNECT_LOG:
 				case HCI_EVENT_BNEP_CHIP_ERROR:
 				case HCI_EVENT_DNS_RSP:
+				case HCI_EVENT_BB_DISCONNECT:
+				case HCI_EVENT_BT_NAME:
+				case HCI_EVENT_UDP_INFO:
+				
 					
 			//		SaveData((uint8_t *)&hci_bt,hci_bt.DataLen+3);
 					SaveData((uint8_t*)&hci_bt,3);
@@ -1166,7 +1255,21 @@
 						case HCI_CMD_BNEP_SEND_TCP_DATA:
 						if(!hci_bt.p_data[1])
 						{
-							 BT_BIT_SET(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCPDATA);
+							 BT_BIT_SET(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCP_DATA);
+						}
+						break;
+						
+						case HCI_CMD_SEND_UDP_DATA:
+						if(!hci_bt.p_data[1])
+						{
+							 BT_BIT_SET(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_UDP_DATA);
+						}
+						break;
+						
+						case HCI_CMD_SEND_BIG_DATA:
+						if(!hci_bt.p_data[1])
+						{
+							 BT_BIT_SET(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCP_BIG_DATA);
 						}
 						break;
 						
@@ -1196,6 +1299,20 @@
 					CmdRepData[0] = hci_bt.p_data[0];
 					CmdRepData[1] = hci_bt.p_data[1];
 					break;
+				
+				case HCI_EVENT_BIG_DATA_FINISH:
+					if(hci_bt.p_data[0]==0x00)
+					{
+						BT_BIT_SET(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCP_BIG_DATA_FINISH);
+					}
+					break;
+				
+				case HCI_EVENT_BIG_DATA_STATUS:
+					if(hci_bt.p_data[0]==0x03||hci_bt.p_data[0]==0x04)
+					{
+						BT_BIT_SET(HCI_CMD_BIT_FLAG,BIT_BNEP_SEND_TCP_BIG_DATA_STATUS);
+					}
+					break;
 
 				default:
 					break;
@@ -1235,6 +1352,7 @@
 	  TempOpcode==BNEP_CONNECT||\
 	  TempOpcode==BNEP_DISCONNECT||\
 	  TempOpcode==BNEP_CHIP_ERROR||\
+		TempOpcode==HCI_EVENT_BB_DISCONNECT||\
 		TempOpcode==PASSKEY)
 	{
 		SkipData(3);
Index: fw/sdk/yc_ipc.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_ipc.c	(revision 710)
+++ /YC3121_SDK/fw/sdk/yc_ipc.c	(working copy)
@@ -1,5 +1,7 @@
 #include "yc_ipc.h"
 
+//#define	IPC_DEBUG
+
 IPC_TypeDef *IpcRx = (IPC_TypeDef *)(IPC_RX_START_ADDR);
 IPC_TypeDef *IpcTx = (IPC_TypeDef *)(IPC_TX_START_ADDR);
 
@@ -29,6 +31,9 @@
 
 void IPC_TxData(HCI_TypeDef *IpcData)
 {
+	#ifdef IPC_DEBUG
+	PrintHCIPack(IpcData,"tx");
+	#endif
     WAKEUP_BT |= (1 << WAKEUP_BT_FLAG);
     IPC_HOLD_BT  = 1;
     delay_ms(10);
@@ -88,7 +93,9 @@
             RB_UPDATE_PTR(Rptr, HR_REG_16BIT(&IpcRx->IpcStartAddr),  HR_REG_16BIT(&IpcRx->IpcEndAddr));
         }
         HW_REG_16BIT(&IpcRx->ReadPtr, (uint32_t)Rptr);
-
+		#ifdef IPC_DEBUG
+		PrintHCIPack(IpcData,"rx");
+		#endif
         return TRUE;
     }
     else
@@ -269,7 +276,7 @@
     for (uint8_t cnt = 0; cnt < msg->DataLen; cnt++)
     {
         MyPrintf("%02x ", msg->p_data[cnt]);
-        if (cnt % 16 == 0)
+        if ((cnt % 16) == 0&&cnt!=0)
             MyPrintf("\n");
     }
     MyPrintf("\n");
