diff --git a/mcu/interface/driver/peripheral/bmd.h b/mcu/interface/driver/peripheral/bmd.h
new file mode 100644
index 0000000..7e72532
--- /dev/null
+++ b/mcu/interface/driver/peripheral/bmd.h
@@ -0,0 +1,356 @@
+ /*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *    bmd.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   This file is intends for ring-buffer API.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#ifndef BMD_H
+#define BMD_H
+
+#include "drv_comm.h"
+
+typedef struct __BUFFER_INFO
+{
+	volatile kal_uint16	Read;		/* @field Current Read index. */
+	volatile kal_uint16	Write;		/* @field Current Write index. */
+	volatile kal_uint16	Length;		/* @field Length of buffer */
+	volatile kal_uint8	*CharBuffer;		/* @field Start of buffer */
+}BUFFER_INFO;
+
+#define ResetFifo(Buffer)   		(Buffer.Write = Buffer.Read = 0)
+#define BWrite(Buffer)	   		(Buffer->Write)
+#define BRead(Buffer)		   	(Buffer->Read)
+#define BLength(Buffer)	   		(Buffer->Length)
+#define BStartAddr(Buffer)     (Buffer->CharBuffer)
+#define BuffWrite(Buffer)   		(Buffer->CharBuffer+Buffer->Write)
+#define BuffRead(Buffer)	   	(Buffer->CharBuffer+Buffer->Read)
+
+#define BWrite_addr(Buffer)	   (Buffer.Write)
+#define BRead_addr(Buffer)		   (Buffer.Read)
+#define BLength_addr(Buffer)	   (Buffer.Length)
+#define BuffWrite_addr(Buffer)   (Buffer.CharBuffer+Buffer.Write)
+#define BuffRead_addr(Buffer)	   (Buffer.CharBuffer+Buffer.Read)
+#define Buff_EndAddr(Buffer)     (Buffer.CharBuffer+Buffer.Length-1)
+#define Buff_StartAddr(Buffer)     (Buffer.CharBuffer)
+
+#define Buff_isEmpty	1
+#define Buff_notEmpty	0
+#define Buff_isFull	1
+#define Buff_notFull	0
+#define Buff_PushOK	0
+#define Buff_PushErr	1
+#define Buff_PopOK	0
+#define Buff_PopErr	1
+
+#define Buf_init(_Buffer,_Buffaddr,_uTotalSize) \
+{\
+   BUFFER_INFO *_Buf=_Buffer;\
+   _Buf->Read = 0;\
+	_Buf->Write = 0;\
+	_Buf->Length = _uTotalSize;\
+	_Buf->CharBuffer = _Buffaddr;\
+}\
+
+#define Buf_IsFull(_Buffer,_result)   \
+{\
+   BUFFER_INFO *_Buf=_Buffer;\
+	kal_uint16 _tmp = BRead(_Buf);\
+	if (_tmp == 0)\
+		_tmp = BLength(_Buf);\
+	if ( (_tmp-BWrite(_Buf)) == 1)\
+	{\
+		_result = Buff_isFull;\
+	}\
+	else\
+	{\
+		_result = Buff_notFull;\
+	}\
+}\
+
+#define Buf_GetRoomLeft(_Buffer,_RoomLeft)   \
+{\
+   BUFFER_INFO *_Buf=_Buffer;\
+   if ( BRead(_Buf) <= BWrite(_Buf) ) \
+	{\
+      _RoomLeft = BLength(_Buf) - BWrite(_Buf) + BRead(_Buf) - 1;\
+	}\
+	else\
+	{\
+		_RoomLeft = BRead(_Buf) - BWrite(_Buf) - 1;\
+	}\
+}\
+
+#define Buf_Push_Multi(_Buffer,_pushDataPointer,_multi,offset) \
+{\
+   BUFFER_INFO *_Buf=_Buffer;\
+   if( (BWrite(_Buf) + _multi) >= BLength(_Buf) ){\
+      kal_mem_cpy(BuffWrite(_Buf), _pushDataPointer + offset, (BLength(_Buf) - BWrite(_Buf))*sizeof(kal_uint8));\
+      kal_mem_cpy(BStartAddr(_Buf) , _pushDataPointer + offset + (BLength(_Buf) - BWrite(_Buf)), (_multi- (BLength(_Buf) - BWrite(_Buf)))*sizeof(kal_uint8));\
+      BWrite(_Buf) = (BWrite(_Buf) + _multi) - BLength(_Buf);\
+   }\
+   else{\
+   kal_mem_cpy(BuffWrite(_Buf), _pushDataPointer + offset, _multi*sizeof(kal_uint8));\
+         BWrite(_Buf) += _multi;\
+}\
+}\
+
+#define Buf_Push(_Buffer,_pushData) \
+{\
+   BUFFER_INFO *_Buf=_Buffer;\
+   *BuffWrite(_Buf) = _pushData;\
+   if(BWrite(_Buf) >= (BLength(_Buf) - 1))\
+   {\
+   	BWrite(_Buf) = 0;\
+   }\
+   else\
+   {\
+	BWrite(_Buf)++;\
+   }\
+}\
+
+#define Buf_GetBytesAvail(_Buffer,_BytesAvail) \
+{\
+   BUFFER_INFO *_Buf = _Buffer;\
+	_BytesAvail = 0;\
+	if (BWrite(_Buf) >= BRead(_Buf))\
+		_BytesAvail = BWrite(_Buf) - BRead(_Buf);\
+	else\
+		_BytesAvail = BLength(_Buf) - BRead(_Buf) + BWrite(_Buf);	\
+}\
+
+#define Buf_GetBytesAvail_DMA(_Buffer,_BytesAvail) \
+{\
+   BUFFER_INFO *_Buf = _Buffer;\
+	_BytesAvail = 0;\
+	if (BWrite(_Buf) >= BRead(_Buf))\
+		_BytesAvail = BWrite(_Buf) - BRead(_Buf);\
+	else\
+		_BytesAvail = BLength(_Buf) - BRead(_Buf);	\
+}\
+
+#define Buf_Pop_Multi(_Buffer,_popDataPointer,_multi,offset) \
+{\
+   BUFFER_INFO *_Buf=_Buffer;\
+   if( (BRead(_Buf) + _multi) >= BLength(_Buf) ){\
+   	kal_mem_cpy(_popDataPointer + offset, BuffRead(_Buf), (BLength(_Buf) - BRead(_Buf))*sizeof(kal_uint8));\
+   	kal_mem_cpy(_popDataPointer + offset + (BLength(_Buf) - BRead(_Buf)), BStartAddr(_Buf), (_multi- (BLength(_Buf) - BRead(_Buf)))*sizeof(kal_uint8));\
+         BRead(_Buf) = BRead(_Buf) + _multi - BLength(_Buf) ;)\
+   else{\
+   	 kal_mem_cpy(_popDataPointer + offset, BuffRead(_Buf), _multi);\
+         BRead(_Buf) += _multi;}\
+}\
+
+#define Buf_Pop(_Buffer,_popData)   \
+{\
+   BUFFER_INFO *_Buf = _Buffer;\
+	_popData= *BuffRead(_Buf);\
+	BRead(_Buf)++;\
+	if (BRead(_Buf) >= BLength(_Buf))\
+	{\
+		BRead(_Buf) -= BLength(_Buf);\
+	}\
+}\
+
+/* should be deleted */
+#define Buf_IsEmpty(_Buffer,_result)   \
+{\
+   BUFFER_INFO *_Buf = _Buffer;\
+	if ( BRead(_Buf) == BWrite(_Buf) ) \
+	{\
+		_result = Buff_isEmpty;\
+	}\
+	else\
+	{\
+		_result = Buff_notEmpty;\
+	}\
+}\
+
+/* void Get32FromBuff(BUFFER_INFO *Buf,kal_uint32 DATA) */
+#define Get32FromBuf(_Buffer,_DATA)    \
+{\
+   BUFFER_INFO *_Buf = _Buffer;\
+	kal_uint8	_tmp,_index;\
+	kal_uint32 	_tmp32;\
+	_DATA =0;\
+	for (_index =0;_index < 4;_index++)\
+	{\
+		Buff_Pop(_Buf,&_tmp);\
+		_tmp32 = (kal_uint32)_tmp;\
+		(_DATA) |= (_tmp32 << (8*_index));\
+	}\
+}\
+
+/*void Put32toBuff(BUFFER_INFO *Buf,kal_uint32 *DATA)*/
+#define Put32toBuf(_Buffer,_DATA)    \
+{\
+   BUFFER_INFO *_Buf = _Buffer;\
+	kal_uint8	_tmp,_index;\
+	kal_uint32 	_tmp32;\
+	for (_index =0;_index < 4;_index++)\
+	{\
+		_tmp32 = ((*_DATA) >> (8*_index));\
+		_tmp = (kal_uint8)_tmp32;\
+		Buff_Push(_Buf,&_tmp);\
+	}\
+}\
+
+#define Buf_Flush(_Buffer) \
+{\
+   BUFFER_INFO *_Buf = _Buffer;\
+	_Buf->Write = _Buf->Read = 0;\
+}
+
+#define Buf_look(_Buffer,_popData,_num)   \
+{\
+   BUFFER_INFO *_Buf = _Buffer;\
+   kal_uint8 _index;\
+   kal_uint16 _tmp;\
+   _tmp = BRead(Buf);\
+   for(_index=0;_index<_num;_index++)\
+   {\
+	   *_popData= *(Buf->CharBuffer+_tmp);\
+	   _tmp++;\
+	   if (_tmp >= BLength(Buf))\
+	   {\
+		   _tmp -= BLength(Buf);\
+	   }\
+	}\
+}
+
+// MoDIS parser skip start
+#if 1
+extern void Buff_init(BUFFER_INFO *Buf,kal_uint8 *Buffaddr, kal_uint16 uTotalSize);
+extern void Buff_Push(BUFFER_INFO *Buf,kal_uint8 *pushData);
+extern void Buff_Pop(BUFFER_INFO *Buf,kal_uint8 *popData);
+extern kal_uint8 Buff_IsEmpty(BUFFER_INFO *Buf);
+extern kal_uint8 Buff_IsFull (BUFFER_INFO *Buf);
+extern kal_uint16 Buff_GetRoomLeft (BUFFER_INFO *Buf);
+extern kal_uint16 Buff_GetBytesAvail (BUFFER_INFO *Buf);
+extern kal_uint16 Buff_GetLength(BUFFER_INFO *Buf);
+extern void Buff_Flush (BUFFER_INFO *Buf);
+extern void Buff_look(BUFFER_INFO *Buf,kal_uint8 *popData,kal_uint8 num);
+extern void Get32FromBuff(BUFFER_INFO *Buf,kal_uint32 *DATA);
+extern void Put32toBuff(BUFFER_INFO *Buf,kal_uint32 *DATA);
+extern void MemCPY(kal_uint8 *dst,kal_uint8 *src,kal_uint32 len);
+extern void MemSET(kal_uint8 *dst,kal_uint8 data,kal_uint32 len);
+#endif
+// MoDIS parser skip end
+
+#endif
+
