[Feature][Modem]Update MTK MODEM V1.6 baseline version: MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6

MTK modem version: MT2735_IVT_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.tar.gz
RF  modem version: NA

Change-Id: I45a4c2752fa9d1a618beacd5d40737fb39ab64fb
diff --git a/mcu/interface/service/stacklib/bitop_funcs.h b/mcu/interface/service/stacklib/bitop_funcs.h
new file mode 100644
index 0000000..d59bdb2
--- /dev/null
+++ b/mcu/interface/service/stacklib/bitop_funcs.h
@@ -0,0 +1,202 @@
+/*****************************************************************************
+*  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:
+ * ---------
+ *   bitop_funcs.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   Functions for putting and getting bit fields into
+ *   byte arrays.
+ *
+ * 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!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+/*********************************************************************
+   (C) _____ (year of first publication) Sasken communication
+   Technologies Limited, All rights reserved.
+*   This file provides a template for .c files. This space
+*   should be used to describe the file contents
+*   Component-specific prefix : xxxx
+*********************************************************************/
+ 
+#ifndef _BITOP_FUNCS_H
+#define _BITOP_FUNCS_H
+/*RHR*/
+#include "kal_general_types.h"
+/*RHR*/
+/***************************************************************************
+ * Exported Function Prototypes
+ ***************************************************************************/
+extern unsigned int mask(unsigned int width);
+
+extern unsigned int get_bits_1_8(
+                          kal_uint8    *addr,
+                          unsigned int offset,
+                          unsigned int width
+                          );
+
+extern unsigned int get_bits_9_16(
+                           kal_uint8    *addr,
+                           unsigned int offset,
+                           unsigned int width
+                           );
+
+extern unsigned int get_bits_17_24(
+                            kal_uint8    *addr,
+                            unsigned int offset,
+                            unsigned int width
+                            );
+
+extern unsigned int get_bits_25_32(
+                            kal_uint8    *addr,
+                            unsigned int offset,
+                            unsigned int width
+                            );
+
+
+extern unsigned int get_bits(
+                      kal_uint8    *addr,
+                      unsigned int offset,
+                      unsigned int width
+                      );
+
+
+extern void put_bits_1_8(
+                  kal_uint8 *addr,
+                  unsigned int offset,
+                  unsigned int width,
+                  unsigned int put_val
+                  );
+
+
+extern void put_bits_9_16(
+                   kal_uint8    *addr,
+                   unsigned int offset,
+                   unsigned int width,
+                   unsigned int put_val
+                   );
+
+
+extern void put_bits_17_24(
+                   kal_uint8    *addr,
+                   unsigned int offset,
+                   unsigned int width,
+                   unsigned int put_val
+                   );
+
+extern void put_bits_25_32(
+                   kal_uint8    *addr,
+                   unsigned int offset,
+                   unsigned int width,
+                   unsigned int put_val
+                   );
+
+
+extern void put_bits(
+              kal_uint8    *addr,
+              unsigned int offset,
+              unsigned int width,
+              unsigned int put_val
+              );
+
+/* constants for shift directions */
+#define SHIFT_LEFT  1
+#define SHIFT_RIGHT 2
+
+/* Length of a static buffer */
+#define SHIFT_BUFFER_LEN 255
+
+void copy_bits16(const kal_uint8 *pzSrc,
+                 kal_uint16      u16SrcIndex,
+                 kal_uint8       *pzDst,
+                 kal_uint16      *pu16DstIndex,
+                 kal_uint16      u16NumBits);
+
+kal_uint16 shift_bits16(kal_uint8   *pzSrc,
+                      kal_uint8     *pzDest,
+                      kal_uint16    u16SizeInBytes,
+                      kal_uint16    u16ShiftBits,
+                      kal_uint16    u16Direction);
+
+/***************************************************************************
+ * Declarations Of Exported Globals
+ ***************************************************************************/
+
+#endif /* _BITOP_FUNCS_H */
+
diff --git a/mcu/interface/service/stacklib/bitop_macros.h b/mcu/interface/service/stacklib/bitop_macros.h
new file mode 100644
index 0000000..504776b
--- /dev/null
+++ b/mcu/interface/service/stacklib/bitop_macros.h
@@ -0,0 +1,270 @@
+/*****************************************************************************
+*  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:
+ * ---------
+ *   bitop_macros.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   Preprocessor macros for putting and getting bit fields into
+*    byte arrays.
+ *
+ * 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!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+/*********************************************************************
+   (C) _____ (year of first publication) Sasken communication
+   Technologies Limited, All rights reserved.
+*   This file provides a template for .c files. This space
+*   should be used to describe the file contents
+*   Component-specific prefix : xxxx
+*********************************************************************/
+ 
+#ifndef _BITOP_MACROS_H
+#define _BITOP_MACROS_H
+
+/***************************************************************************
+ * Macros With Parameters
+ ***************************************************************************/
+
+#define MASK(_w) ( ((_w)>31) ? 0xffffffff : (0x1u << (_w)) - 1 )
+
+
+/* _uc is the pointer to the byte stream from which bits to be read */
+/* _s is the offset in bits from MSB of the byte stream _uc  */
+/* _w is the number of bits to be read  */
+
+#define GET_BITS_1_8(_uc, _s, _w) (                                  \
+   (((_s)+(_w)>8) ? *(_uc) << ((_s)+(_w)-8) |                        \
+    *((_uc)+1) >> (16-(_s)-(_w)) :                                   \
+     *(_uc) << (_s) >> (8-(_w)))                                     \
+    & MASK(_w) )
+
+#define GET_BITS_9_16(_uc, _s, _w) (                                 \
+   ((_s+_w>16) ? *_uc << (_s+_w-8) | *(_uc+1) << (_s+_w-16) |        \
+    *(_uc+2) >> (24-_s-_w) :                                         \
+        *_uc << (_s+_w-8) | *(_uc+1) >> (16-_s-_w))                  \
+    & MASK(_w))
+
+#define GET_BITS_17_24(_uc, _s, _w) (                                \
+    (((_s)+(_w)>24) ? *(_uc) << ((_s)+(_w)-8) |                      \
+     *((_uc)+1) << ((_s)+(_w)-16) |                                  \
+     *((_uc)+2) << ((_s)+(_w)-24) | *((_uc)+3) >> (32-(_s)-(_w)) :   \
+        *(_uc) << ((_s)+(_w)-8) | *((_uc)+1) << ((_s)+(_w)-16) |     \
+        *((_uc)+2) >> (24-(_s)-(_w)))                                \
+    & MASK(_w))
+
+#define GET_BITS_25_32(_uc, _s, _w) (                               \
+    (((_s)+(_w)>32) ? *(_uc) << ((_s)+(_w)-8) |                      \
+     *((_uc)+1) << ((_s)+(_w)-16) |                                  \
+     *((_uc)+2) << ((_s)+(_w)-24) | *((_uc)+3) << ((_s)+(_w)-32) |   \
+     *((_uc)+4) >> (40-(_s)-(_w)) : *(_uc) << ((_s)+(_w)-8) |        \
+     *((_uc)+1) << ((_s)+(_w)-16) | *((_uc)+2) << ((_s)+(_w)-24) |   \
+     *((_uc)+3) >> (32-(_s)-(_w))) & MASK(_w))
+
+#define GET_BITS(_uc, _s, _w) (                                      \
+    ((_w)>8) ? (((_w)>16) ? (((_w)>24) ?                             \
+        GET_BITS_25_32((_uc), (_s), (_w)) :                          \
+        GET_BITS_17_24((_uc), (_s), (_w))) :                         \
+        GET_BITS_9_16((_uc), (_s), (_w))) :                          \
+        GET_BITS_1_8((_uc), (_s), (_w))                              \
+    )
+
+/* _uc is the pointer to the byte stream to which bits to be written */
+/* _s is the offset in bits from MSB of the byte stream _uc  */
+/* _w is the number of bits to be written  */
+/* _i is the value to be written  */
+
+#define PUT_BITS_1_8(_uc, _s, _w, _i)                                \
+    if ((_s)+(_w)>8) {                                               \
+        *(_uc)     &= ~ MASK(8-(_s));                               \
+        *(_uc)     |= ((_i) & MASK((_w))) >> ((_s)+(_w)- 8);        \
+        *((_uc)+1)   = (*((_uc)+1) & MASK(16-(_s)-(_w))) |           \
+        (_i) << (16-(_s)-(_w));                                      \
+    } else {                                                         \
+        *(_uc)     &= ~ (MASK((_w)) << ( 8-(_w)-(_s)));             \
+        *(_uc)     |= ((_i) & MASK((_w))) << ( 8-(_w)-(_s));        \
+    }
+
+#define PUT_BITS_9_16(_uc, _s, _w, _i)                               \
+    *(_uc) &= ~ MASK(8-(_s));                                       \
+    if ((_s)+(_w)>16) {                                              \
+        *(_uc)     |= ((_i) & MASK((_w))) >> ((_s)+(_w)- 8);        \
+        *((_uc)+1)   = (_i) >> ((_s)+(_w)-16);                       \
+        *((_uc)+2)   = (*((_uc)+2) & MASK(24-(_s)-(_w))) |           \
+        (_i) << (24-(_s)-(_w));                                      \
+    } else {                                                         \
+        *(_uc)     |= ((_i) & MASK((_w))) >> ((_s)+(_w)- 8);        \
+        *((_uc)+1)   = (*((_uc)+1) & MASK(16-(_s)-(_w))) |           \
+        (_i) << (16-(_s)-(_w));                                      \
+    }
+
+#define PUT_BITS_17_24(_uc, _s, _w, _i)                              \
+    *(_uc) &= ~ MASK(8-(_s));                                       \
+    if ((_s)+(_w)>24) {                                              \
+        *(_uc)     |= ((_i) & MASK((_w))) >> ((_s)+(_w)- 8);        \
+        *((_uc)+1)   = (_i) >> ((_s)+(_w)-16);                       \
+        *((_uc)+2)   = (_i) >> ((_s)+(_w)-24);                       \
+        *((_uc)+3)   = (*((_uc)+3) & MASK(32-(_s)-(_w))) |           \
+        (_i) << (32-(_s)-(_w));                                      \
+    } else {                                                         \
+        *(_uc)     |= ((_i) & MASK((_w))) >> ((_s)+(_w)- 8);        \
+        *((_uc)+1)   = (_i) >> ((_s)+(_w)-16);                       \
+        *((_uc)+2)   = (*((_uc)+2) & MASK(24-(_s)-(_w))) |           \
+        (_i) << (24-(_s)-(_w));                                      \
+    }
+
+#define PUT_BITS_25_32(_uc, _s, _w, _i)                              \
+    *(_uc) &= ~MASK(8-(_s));                                        \
+    if ((_s)+(_w)>32) {                                              \
+        *(_uc)     |= ((_i) & MASK((_w))) >> ((_s)+(_w)- 8);        \
+        *((_uc)+1)   = (_i) >> ((_s)+(_w)-16);                       \
+        *((_uc)+2)   = (_i) >> ((_s)+(_w)-24);                       \
+        *((_uc)+3)   = (_i) >> ((_s)+(_w)-32);                       \
+        *((_uc)+4)   = (*((_uc)+4) & MASK(40-(_s)-(_w))) |           \
+        (_i) << (40-(_s)-(_w));                                      \
+    } else {                                                         \
+        *(_uc)     |= ((_i) & MASK((_w))) >> ((_s)+(_w)- 8);        \
+        *((_uc)+1)   = (_i) >> ((_s)+(_w)-16);                       \
+        *((_uc)+2)   = (_i) >> ((_s)+(_w)-24);                       \
+        *((_uc)+3)   = (*((_uc)+3) & MASK(32-(_s)-(_w))) |           \
+        (_i) << (32-(_s)-(_w));                                      \
+    }
+
+#define PUT_BITS(_uc, _s, _w, _i)                                    \
+    if ((_w)<9) {                                                    \
+        PUT_BITS_1_8(_uc, _s, _w, _i)                                \
+    } else if ((_w)<17) {                                            \
+        PUT_BITS_9_16(_uc, _s, _w, _i)                               \
+    } else if ((_w)<25) {                                            \
+        PUT_BITS_17_24(_uc, _s, _w, _i)                              \
+    } else {                                                         \
+        PUT_BITS_25_32(_uc, _s, _w, _i)                              \
+    }
+
+
+/********************************************************************/
+/* This macro insert a given number of bits to a bit position
+ * by shifting the existing bits down. */
+
+/* ptr is the pointer to the byte stream
+ * to which bits to be inserted.         */
+/* _offset is the offset in bytes from MSB of byte stream ptr.  */
+/* length is the number of bits to be inserted.                 */
+/* _size is the number of bits in the bit stream, after the point
+ * of insertion ,which is to be shifted. */
+/* _value is the value to be inserted.   */
+
+
+#define INSERT_BITS(ptr,_offset,length,_size,_value)                 \
+{                                                                    \
+    unsigned int temp,value =_value;                                 \
+    unsigned short int offset=_offset,size=_size;                    \
+    while(length <= size) {                                          \
+        temp = GET_BITS(ptr,offset,length);                          \
+        PUT_BITS(ptr,offset,length,value);                           \
+        ptr = ptr +((offset+length)/8);                              \
+        offset = (offset+length)%8;                                  \
+        size -=length;                                               \
+        value = temp;                                                \
+    }                                                                \
+    temp = GET_BITS(ptr,offset,size);                                \
+    PUT_BITS(ptr,offset,length,value);                               \
+    ptr = ptr +(offset+length)/8;                                    \
+    offset = (offset+length)%8;                                      \
+    PUT_BITS(ptr,offset,size,temp);                                  \
+}
+
+/* Conversions for length fields                                      */
+/* BITS_TO_BYTES_INC converts a length in bits, to a length in bytes, */
+/* inclusive of remainder (i.e. rounding up)                          */
+/* BITS_TO_BYTES_EXC converts a length in bits, to a length in bytes, */
+/* exclusive of remainder (i.e. rounding down)                        */
+/* These macros work for all types of integer                         */
+/* but beware sufficient headroom on BYTES_TO_BITS                    */
+#define BITS_TO_BYTES_INC(bit_length) (((bit_length)+7)/8)
+#define BITS_TO_BYTES_EXC(bit_length) ((bit_length)/8)
+#define BYTES_TO_BITS(length) ((length)*8)
+
+/* Similar to round up to fit U32s                                    */
+/* for buffer size allocation etc.                                    */
+#define BITS_TO_U32S_INC(bit_length) (((bit_length)+31)/32)
+#define BYTES_TO_U32S_INC(length) (((length)+3)/4)
+
+#endif /* _BITOP_MACROS_H */
+
+
diff --git a/mcu/interface/service/stacklib/bitstream.h b/mcu/interface/service/stacklib/bitstream.h
new file mode 100644
index 0000000..02528f2
--- /dev/null
+++ b/mcu/interface/service/stacklib/bitstream.h
@@ -0,0 +1,268 @@
+/*****************************************************************************
+*  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:
+ * ---------
+ *   bitstream.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   BitStream allows sequential reading and writing of bit fields.
+ *
+ * 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!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+/*********************************************************************
+   (C) _____ (year of first publication) Sasken communication
+   Technologies Limited, All rights reserved.
+*   This file provides a template for .c files. This space
+*   should be used to describe the file contents
+*   Component-specific prefix : xxxx
+*********************************************************************/
+ 
+#ifndef _BITSTREAM_H
+#define _BITSTREAM_H
+/*RHR*/
+#include "kal_general_types.h"
+/*RHR*/
+/* BitStream
+ *
+ *      A bit stream allows bit fields to be read and written to,
+ *      just like an byte stream allows byte to be read and written
+ *      to. Reading and writing of bit fields is done to an underlying
+ *      byte stream, in network byte order.
+ *
+ *      bit_stream_init sets the underlying byte stream and the
+ *      current read/write position within the byte stream. Can also
+ *      be called when a seek to a new position is desired.
+
+ *      The values which are read by bit_stream_read are returned as
+ *      native unsigned integers.
+ *
+ *      Similarly the values which are passed to bit_stream_write for
+ *      writing should be passed as native unsigned integers.
+ *
+ *      Both bit_stream_read and bit_stream_write, increment the
+ *      current position,to facilitate sequential operation.
+ *      bit_stream_cur_pos returns the number of bytes, the underlying
+ *      byte pointer has been moved since bit_stream_init.
+ *
+ */
+
+typedef struct bit_stream {
+    kal_uint8    *byte_stream; /* Pointer to underlying byte stream. */
+    kal_uint8    *byte_stream_start;
+    kal_uint8    offset;    /* Offset in bits from MSB of byte_stream */
+} bit_stream;
+
+/* Initialise Bit stream operations
+ *
+ *                                offset
+ *                                |
+ *                                V
+ *               /-------------------------------\
+ * byte_stream-->|   |   |   |   |   |   |   |   |
+ *               |---|---|---|---|---|---|---|---|
+ *               |   |   |   |   |   |   |   |   |
+ *               |---|---|---|---|---|---|---|---|
+ *               |   |   |   |   |   |   |   |   |
+ *               |---|---|---|---|---|---|---|---|
+ *               | . | . | . | . | . | . | . | . |
+ *                 .   .   .   .   .   .   .   .
+ *                 .   .   .   .   .   .   .   .
+ *
+ *  If offset is more than eight then, byte_stream is incremented by
+ *  offset/8 and offset is taken to be offset modulo 8.
+ */
+extern void bit_stream_init(
+                            bit_stream      *bs,
+                            kal_uint8       *byte_stream,
+                            unsigned int    offset);
+
+/* Read specified number of bits from current position and return it as
+ *  an unsigned integer.
+ *
+ *                                        offset (before)
+ *                                        |
+ *                                        V
+ *                       /-------------------------------\
+ * byte_stream (before)->|   |   |   |   | 1 | 0 | 0 | 0 |
+ *                       |---|---|---|---|---|---|---|---|
+ * byte_stream (after) ->| 1 | 0 |   |   |   |   |   |   |
+ *                       |---|---|---|---|---|---|---|---|
+ *                       | . | . | ^ | . | . | . | . | . |
+ *                                 |
+ *                                 offset (after)
+ *
+ *      On the above stream bit_stream_read(bs, 6) will return 34
+ */
+extern unsigned int bit_stream_read(
+                                    bit_stream      *bs,
+                                    unsigned int    width);
+
+
+/* Write specified number of bits from current position into the
+ * underlying byte stream.
+ *
+ *              bit_stream_write(bs, 6)
+ *
+ *                                        offset (before)
+ *                                        |
+ *                                        V
+ *                       /-------------------------------\
+ * byte_stream (before)->|   |   |   |   | 1 | 0 | 0 | 0 |
+ *                       |---|---|---|---|---|---|---|---|
+ * byte_stream (after) ->| 1 | 0 |   |   |   |   |   |   |
+ *                       |---|---|---|---|---|---|---|---|
+ *                       | . | . | ^ | . | . | . | . | . |
+ *                                 |
+ *                                 offset (after)
+ *
+ */
+extern void bit_stream_write(
+                             bit_stream      *bs,
+                             unsigned int    width,
+                             unsigned int    value );
+
+/* Return the number of bits the internal pointer has moved since
+ * bit_stream_init */
+extern unsigned int bit_stream_cur_pos(bit_stream    *bs);
+
+/* Move pointer back by given number of bits */
+extern void bit_stream_move_back(
+                                 bit_stream      *bs,
+                                 unsigned int    bits);
+
+/* Copy bits from one byte stream to another.
+ * Byte stream is incremented as read operation
+ * is done */
+
+extern void byte_stream_bit_copy(
+                                 kal_uint8      *s,
+                                 unsigned int   s_offset,
+                                 unsigned int   length,
+                                 kal_uint8      *d,
+                                 unsigned int   d_offset);
+
+
+/* Read specified number of bits from the bitstream, starting
+ * from a position, width bits before the current position.
+
+ *
+ *                                        offset (after)
+ *                                        |
+ *                                        V
+ *                       /-------------------------------\
+ * byte_stream (after)-> |   |   |   |   | 1 | 0 | 0 | 0 |
+ *                       |---|---|---|---|---|---|---|---|
+ * byte_stream (before)->| 1 | 0 |   |   |   |   |   |   |
+ *                       |---|---|---|---|---|---|---|---|
+ *                       | . | . | ^ | . | . | . | . | . |
+ *                                 |
+ *                                 offset (before)
+ *
+ *      On the above stream ,
+ *         bit_stream_read_back(bs, 6) will return 34
+ */
+
+extern unsigned int bit_stream_read_back(
+                                         bit_stream    *bs,
+                                         unsigned int  width);
+
+
+
+/* Write specified number of bits to the bitstream starting
+ * from a position width bits before the current position.
+ *
+ *     bit_stream_write_back(bs, 6, 34) will return
+ *
+ *
+ *                                        offset (after)
+ *                                        |
+ *                                        V
+ *                       /-------------------------------\
+ * byte_stream (after) ->|   |   |   |   | 1 | 0 | 0 | 0 |
+ *                       |---|---|---|---|---|---|---|---|
+ * byte_stream (before)->| 1 | 0 |   |   |   |   |   |   |
+ *                       |---|---|---|---|---|---|---|---|
+ *                       | . | . | ^ | . | . | . | . | . |
+ *                                 |
+ *                                 offset (before)
+ *
+ */
+extern void bit_stream_write_back(
+                                  bit_stream      *bs,
+                                  unsigned int    width,
+                                  unsigned int    value );
+#endif /* _BITSTREAM_H */
+
diff --git a/mcu/interface/service/stacklib/dlist.h b/mcu/interface/service/stacklib/dlist.h
new file mode 100644
index 0000000..05b9abd
--- /dev/null
+++ b/mcu/interface/service/stacklib/dlist.h
@@ -0,0 +1,482 @@
+/*****************************************************************************
+*  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:
+ * ---------
+ *	dlist.h
+ *
+ * Project:
+ * --------
+ *   Maui
+ *
+ * Description:
+ * ------------
+ * Header file for double linked list facility
+ *
+ * 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!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#ifndef __DLIST_H__
+#define __DLIST_H__
+ 
+//#include "kal_release.h"
+/*RHR*/
+#include "kal_general_types.h"
+/*RHR*/
+/* TYPES DEFINITIONS ********************************************************/
+/*
+ * DLIST_LINK: The structure used for a link in a doubly linked list.
+ * The pThis field is a generic pointer that points to the item being listed.
+ * The pNext field is a pointer to the next link in the list, and is NULL for
+ * the last link in the list.
+ */
+typedef struct DLIST_LINK_TAG
+{
+    void                    *pThis; /*
+                                     * Pointer to the item in the list
+                                     */
+    struct DLIST_LINK_TAG   *pPrev; /*
+                                     * Pointer to the previous link in the list
+                                     */
+    struct DLIST_LINK_TAG   *pNext; /*
+                                     * Pointer to the next link in the list
+                                     */
+} DLIST_LINK;
+
+/*
+ * DLIST_HEAD: The structure used for the head of a doubly linked list.
+ * The ulCount field contains the number of links in the doubly linked list,
+ * and will be zero when the doubly linked list is empty.
+ * The pFirst field is a pointer to the first link in the doubly linked list,
+ * and will be NULL for an empty list.
+ */
+typedef struct DLIST_HEAD_TAG
+{
+    kal_uint32                     ulCount;    /*
+                                         * A count of the number of links in
+                                         * the list
+                                         */
+    struct DLIST_LINK_TAG   *pFirst;    /*
+                                         * A pointer to the first link in the
+                                         * list
+                                         */
+    struct DLIST_LINK_TAG   *pLast;     /*
+                                         * A pointer to the last link in the
+                                         * list
+                                         */
+} DLIST_HEAD;
+
+/*
+ * DLIST_HANDLE: Pointer to DLIST_HEAD structure to be used as a handle for the
+ * doubly linked list.
+ */
+typedef DLIST_HEAD *DLIST_HANDLE;
+
+/*
+ * DLIST_LINK_HANDLE: Pointer to DLIST_LINK structure to be used as a handle for
+ * a link in a doubly linked list.
+ */
+typedef DLIST_LINK *DLIST_LINK_HANDLE;
+
+
+/* GLOBAL VARIABLE DECLARATIONS *********************************************/
+/* The Omitted Storage Class Model is assumed. The storage class
+ * "extern" must be explicitly included on all referencing
+ * declarations, and the storage class must omitted from the single
+ * defining declaration for each external variable. The defining
+ * declaration can include an initializer, but it is not required to
+ * do so. It is invalid to have both an initiliazer and the storage
+ * class extern in a declaration (ref:[4.8.2; A Reference Manual]).
+ *
+ * Use global variables for performance improvement and always provide
+ * MACROS to manipulate them. E.g. SET(v) and GET.  */
+
+/* PUBLIC FUNCTION PROTOTYPES ***********************************************/
+
+
+
+/**
+ * Description: Intialises a DLIST_HEAD
+ * structure before first use
+ *
+ * Notes:       Sets ulCount to zero and pFirst to
+ * NULL.
+ */
+extern void DlistInit(DLIST_HANDLE hList);
+
+/**
+ * Description: Destroy the link list.
+ *
+ * Notes:       Frees all links in the list, but not
+ *              their items.
+ *
+ * @param hList
+ * @return kal_bool: TRUE if successful, FALSE is not
+ */
+extern kal_bool DlistDeleteAll_Dbg(DLIST_HANDLE hList,
+                                   kal_char *filename, kal_uint32 line);
+
+#if defined(DEBUG_KAL) && defined(DEBUG_BUF2)
+#define DlistDeleteAll(hList) \
+    DlistDeleteAll_Dbg(hList, __FILE__, __LINE__)
+#else
+#define DlistDeleteAll(hList) \
+    DlistDeleteAll_Dbg(hList, NULL, 0)
+#endif
+
+/****************************************************************************
+ * Function:    DlistInsertAtStart
+ * Description: Adds a new link to the start of the doubly linked list
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ *              pThis: The item to be added to the doubly linked list
+ * Returns:     kal_bool: TRUE if successful, FALSE is not
+ * Notes:       Allocates memory for a new DLIST_LINK.
+ *              Returns TRUE if the memory was allocated, else FALSE.
+ ****************************************************************************/
+
+extern kal_bool DlistInsertAtStart_Dbg(DLIST_HANDLE hList, void *pThis,
+                                       kal_char *filename, kal_uint32 line);
+extern kal_bool DlistInsertAtFront(DLIST_HANDLE hList, void *pThis, DLIST_LINK_HANDLE hLink);
+
+#if defined(DEBUG_KAL) && defined(DEBUG_BUF2)
+#define DlistInsertAtStart(hList, pThis) \
+    DlistInsertAtStart_Dbg(hList, pThis, __FILE__, __LINE__)
+#else
+#define DlistInsertAtStart(hList, pThis) \
+    DlistInsertAtStart_Dbg(hList, pThis, NULL, 0)
+#endif
+
+/****************************************************************************
+ * Function:    DlistInsertAtEnd
+ * Description: Adds a new link to the end of the doubly linked list
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ *              pThis: The item to be added to the doubly linked list
+ * Returns:     kal_bool: TRUE if successful, FALSE is not
+ * Notes:       Allocates memory for a new DLIST_LINK.
+ *              Returns TRUE if the memory was allocated, else FALSE.
+ ****************************************************************************/
+
+extern kal_bool DlistInsertAtEnd_Dbg(DLIST_HANDLE hList, void *pThis,
+                                     kal_char *filename, kal_uint32 line);
+#if defined(DEBUG_KAL) && defined(DEBUG_BUF2)
+#define DlistInsertAtEnd(hList, pThis) \
+    DlistInsertAtEnd_Dbg(hList, pThis, __FILE__, __LINE__)
+#else
+#define DlistInsertAtEnd(hList, pThis) \
+    DlistInsertAtEnd_Dbg(hList, pThis, NULL, 0)
+#endif
+
+/****************************************************************************
+ * Function:    DlistInsertAfter
+ * Description: Adds a new link after the given link of the doubly linked list
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ *              phLink: Pointer to a pointer to the link to insert after
+ *              pThis: The item to be added to the doubly linked list
+ * Returns:     kal_bool: TRUE if successful, FALSE is not
+ * Notes:       Need to use DlistFirst, DlistNext or DlistFind to set phLink
+ *              before calling this function.
+ *              Allocates memory for a new DLIST_LINK.
+ *              Returns TRUE if the memory was allocated, else FALSE.
+ ****************************************************************************/
+
+extern kal_bool DlistInsertAfter_Dbg(DLIST_HANDLE hList,
+                                     DLIST_LINK_HANDLE *phLink, void *pThis,
+                                     kal_char *filename, kal_uint32 line);
+
+#if defined(DEBUG_KAL) && defined(DEBUG_BUF2)
+#define DlistInsertAfter(hList, phLink, pThis) \
+    DlistInsertAfter_Dbg(hList, phLink, pThis, __FILE__, __LINE__)
+#else
+#define DlistInsertAfter(hList, phLink, pThis) \
+    DlistInsertAfter_Dbg(hList, phLink, pThis, NULL, 0)
+#endif
+
+/****************************************************************************
+ * Function:    DlistInsertBefore
+ * Description: Adds a new link before the given link of the doubly linked list
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ *              phLink: Pointer to a pointer to the link to insert before
+ *              pThis: The item to be added to the doubly linked list
+ * Returns:     kal_bool: TRUE if successful, FALSE is not
+ * Notes:       Need to use DlistFirst, DlistNext or DlistFind to set phLink
+ *              before calling this function.
+ *              Allocates memory for a new DLIST_LINK.
+ *              Returns TRUE if the memory was allocated, else FALSE.
+ ****************************************************************************/
+
+extern kal_bool DlistInsertBefore_Dbg(DLIST_HANDLE hList,
+                                      DLIST_LINK_HANDLE *phLink, void *pThis,
+                                      kal_char *filename, kal_uint32 line);
+
+#if defined(DEBUG_KAL) && defined(DEBUG_BUF2)
+#define DlistInsertBefore(hList, phLink, pThis) \
+    DlistInsertBefore_Dbg(hList, phLink, pThis, __FILE__, __LINE__)
+#else
+#define DlistInsertBefore(hList, phLink, pThis) \
+    DlistInsertBefore_Dbg(hList, phLink, pThis, NULL, 0)
+#endif
+
+/****************************************************************************
+ * Function:    DlistSort
+ * Description: Sorts a doubly linked list into item order
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ *              Compare: Pointer to a function that compares two items,
+ *              pThis and pNext, returning an int which is:
+ *                  zero if pThis == pNext
+ *                  negative if pThis < pNext
+ *                  positive if pThis > pNext
+ * Returns:     kal_bool: TRUE if successful, FALSE is not
+ * Notes:       DlistSort swaps items on Compare returning a positive result.
+ *              To sort into the reverse order, use a different Compare
+ *              function that inverts the positive and negative results.
+ ****************************************************************************/
+
+extern void DlistSort(DLIST_HANDLE hList, int (*Compare)(void *pThis, void *pNext));
+
+/****************************************************************************
+ * Function:    DlistFirst
+ * Description: Gets the first item in the doubly linked list and sets the
+ *              pointer at phLink for use by DlistNext, DlistInsertAfter or
+ *              DlistDelete.
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ *              phLink: Pointer to a pointer to be set to the first link
+ * Returns:     void *: Pointer to pThis of first link, or NULL if empty list.
+ * Notes:       Might return NULL if pThis of first link is NULL pointer, or
+ *              if the doubly linked list is empty. The pointer at phLink
+ *              will be set to NULL if the doubly linked list is empty.
+ ****************************************************************************/
+
+extern void *DlistFirst(DLIST_HANDLE hList, DLIST_LINK_HANDLE *phLink);
+
+/****************************************************************************
+ * Function:    DlistLast
+ * Description: Gets the last item in the doubly linked list and sets the
+ *              pointer at phLink for use by DlistPrev, DlistInsertAfter or
+ *              DlistDelete.
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ *              phLink: Pointer to a pointer to be set to the last link
+ * Returns:     void *: Pointer to pThis of last link, or NULL if empty list.
+ * Notes:       Might return NULL if pThis of last link is NULL pointer, or
+ *              if the doubly linked list is empty. The pointer at phLink
+ *              will be set to NULL if the doubly linked list is empty.
+ ****************************************************************************/
+
+extern void *DlistLast(DLIST_HANDLE hList, DLIST_LINK_HANDLE *phLink);
+
+/****************************************************************************
+ * Function:    DlistNext
+ * Description: Gets the next item in the doubly linked list and sets the
+ *              pointer at phLink for use by DlistInsertAfter or DlistDelete.
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ *              phLink: Pointer to a pointer to be set to the next link
+ * Returns:     void *: Pointer to pThis of next link, or NULL if end of list.
+ * Notes:       Might return NULL if pThis of first link is NULL pointer, or
+ *              if the end of the doubly linked list has been reached. The
+ *              pointer at phLink will be set to NULL if the end of the doubly
+ *              linked list has been reached.
+ ****************************************************************************/
+
+extern void *DlistNext(DLIST_HANDLE hList, DLIST_LINK_HANDLE *phLink);
+
+/****************************************************************************
+ * Function:    DlistThis
+ * Description: Gets the current item in the doubly linked. Useful after a call
+ *               to DlistDelete, where DlistNext will skip an item
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ *              phLink: Pointer to a pointer to be set to the next link
+ * Returns:     void *: Pointer to pThis of this link.
+ * Notes:       Might return NULL if pThis of this link is NULL pointer.
+ ****************************************************************************/
+
+extern void *DlistThis(DLIST_HANDLE hList, DLIST_LINK_HANDLE *phLink);
+
+/****************************************************************************
+ * Function:    DlistPrev
+ * Description: Gets the previous item in the doubly linked list and sets the
+ *              pointer at phLink for use by DlistInsertAfter or DlistDelete.
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ *              phLink: Pointer to a pointer to be set to the previous link
+ * Returns:     void *: Pointer to pThis of previous link, or NULL if end of
+ *              list.
+ * Notes:       Might return NULL if pThis of first link is NULL pointer, or
+ *              if the end of the doubly linked list has been reached. The
+ *              pointer at phLink will be set to NULL if the end of the doubly
+ *              linked list has been reached.
+ ****************************************************************************/
+
+extern void *DlistPrev(DLIST_HANDLE hList, DLIST_LINK_HANDLE *phLink);
+
+/****************************************************************************
+ * Function:    DlistFind
+ * Description: Finds a particular item in a doubly linked list
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ *              phLink: Pointer to a pointer to be set to the found link
+ *              pTarget: Pointer to the "value" being sought
+ *              Compare: Pointer to a function that compares an item, pThis,
+ *              with the "value" being sought, pTarget, returning an int which
+ *              is zero if pThis == pTarget, else non-zero.
+ * Returns:     void *: Pointer to pThis of link found, or NULL if not found.
+ * Notes:       Sets the pointer at phLink to the link found, for use in
+ *              subsequent DlistInsertAfter, DlistDelete or DlistNext calls.
+ ****************************************************************************/
+
+extern void *DlistFind(DLIST_HANDLE hList, DLIST_LINK_HANDLE *phLink, void *pTarget,
+                int (*Compare)(void *pThis, void *pTarget));
+
+/****************************************************************************
+ * Function:    DlistDelete
+ * Description: Deletes a particular item in a doubly linked list
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ *              phLink: Pointer to a pointer the link to be deleted
+ * Returns:     kal_bool: TRUE if the pointer at phLink was not NULL, else FALSE
+ * Notes:       Sets the pointer at phLink to the next link, for use in
+ *              subsequent DlistInsertAfter, DlistDelete or DlistNext calls.
+ ****************************************************************************/
+
+extern kal_bool DlistDelete_Dbg(DLIST_HANDLE hList, DLIST_LINK_HANDLE *phLink,
+                                kal_char *filename, kal_uint32 line);
+
+#if defined(DEBUG_KAL) && defined(DEBUG_BUF2)
+#define DlistDelete(hList, phLink) \
+    DlistDelete_Dbg(hList, phLink, __FILE__, __LINE__)
+#else
+#define DlistDelete(hList, phLink) \
+    DlistDelete_Dbg(hList, phLink, NULL, 0)
+#endif
+
+/****************************************************************************
+ * Function:    DlistCount
+ * Description: Obtains the number of links in the doubly linked list
+ * Parameters:  hList: Pointer to a DLIST_HEAD structure
+ * Returns:     kal_uint32: the value of the DLIST_HEAD structure's ulCount field
+ * Notes:       Enables functions using Dlist to treat DLIST_HEAD as a handle
+ ****************************************************************************/
+
+extern kal_uint32 DlistCount(DLIST_HANDLE hList);
+
+//#define KAREN_TRACE
+
+#ifndef GEN_FOR_PC
+//#include <stdio.h>
+#endif
+
+#endif /* __DLIST_H__ */
diff --git a/mcu/interface/service/stacklib/lcd.h b/mcu/interface/service/stacklib/lcd.h
new file mode 100644
index 0000000..ab00606
--- /dev/null
+++ b/mcu/interface/service/stacklib/lcd.h
@@ -0,0 +1,118 @@
+/*****************************************************************************
+*  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:
+ * ---------
+ *   lcd.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   Header file for definitions common to the Light weight C Data
+ *   structures library.
+ *
+ * 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!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+/*********************************************************************
+   (C) _____ (year of first publication) Sasken communication
+   Technologies Limited, All rights reserved.
+*   This file provides a template for .c files. This space
+*   should be used to describe the file contents
+*   Component-specific prefix : xxxx
+*********************************************************************/
+ 
+#ifndef _LCD_H
+#define _LCD_H
+/*RHR*/
+#include "kal_general_types.h"
+/*RHR*/
+/*************************************************************************
+ * Type Definitions
+ *************************************************************************/
+/* Comparison function, returns -1, 0, or 1 depending of whether first
+ * argument is less than, equal to or greater than second argument
+ * (like strcmp).
+ */
+typedef int  (*lcd_cmpfunc)(const void *, const void *);
+typedef void (*lcd_mapfunc)(void *, void *);
+typedef kal_bool (*lcd_cmapfunc)(void*, void*);
+#endif /* _LCD_H */
+
+
diff --git a/mcu/interface/service/stacklib/lcd_cqueue.h b/mcu/interface/service/stacklib/lcd_cqueue.h
new file mode 100644
index 0000000..57c9819
--- /dev/null
+++ b/mcu/interface/service/stacklib/lcd_cqueue.h
@@ -0,0 +1,163 @@
+/*****************************************************************************
+*  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:
+ * ---------
+ *   lcdcqueue.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   Light weight C Data structures library: Circular Queue.
+ *
+ * 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!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+/*********************************************************************
+   (C) _____ (year of first publication) Sasken communication
+   Technologies Limited, All rights reserved.
+*   This file provides a template for .c files. This space
+*   should be used to describe the file contents
+*   Component-specific prefix : xxxx
+*********************************************************************/
+ 
+#ifndef _LCD_CQUEUE_H
+#define _LCD_CQUEUE_H
+/*RHR*/
+#include "kal_general_types.h"
+//#include "stacklib.h"
+#include "lcd.h"
+#include "kal_public_api.h"
+/*RHR*/
+/*******************************************************************************
+ * Data Structure definition
+ *******************************************************************************/
+typedef struct lcd_cqueue {
+    void        * * queue;
+    unsigned    int size;
+    unsigned    int head;
+    unsigned    int tail;
+    unsigned    int is_full;
+} lcd_cqueue;
+
+/*******************************************************************************
+ * Exported Function Prototypes
+ *******************************************************************************/
+extern kal_uint32 new_lcd_cqueue_mem_size(unsigned int size);
+
+extern void lcd_cqueue_insert(lcd_cqueue *q, void *item);
+
+extern void lcd_cqueue_insert_front(lcd_cqueue *q, void *item);
+
+extern void *lcd_cqueue_remove(lcd_cqueue *q);
+
+extern void *lcd_cqueue_remove_rear(lcd_cqueue *q);
+
+extern kal_bool lcd_cqueue_is_empty(lcd_cqueue *q);
+
+extern kal_bool lcd_cqueue_is_full(lcd_cqueue *q);
+
+extern unsigned int lcd_cqueue_num_of_items(lcd_cqueue *q);
+
+extern void *lcd_cqueue_index(lcd_cqueue *q , unsigned int    index);
+
+extern void lcd_cqueue_map(lcd_cqueue *q, lcd_mapfunc f, void *info);
+
+extern void lcd_cqueue_delete_all(lcd_cqueue *q);
+
+extern void lcd_cqueue_init(unsigned int size, lcd_cqueue *q);
+
+#ifdef _DEBUG_LCD_CQUEUE
+extern void lcd_cqueue_print(lcd_cqueue    *q);
+#endif
+#endif /* _LCD_CQUEUE_H */
+
+
diff --git a/mcu/interface/service/stacklib/lcd_ip_cqueue.h b/mcu/interface/service/stacklib/lcd_ip_cqueue.h
new file mode 100644
index 0000000..9056c6d
--- /dev/null
+++ b/mcu/interface/service/stacklib/lcd_ip_cqueue.h
@@ -0,0 +1,738 @@
+/*****************************************************************************
+*  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:
+ * ---------
+ *   lcd_ip_cqueue.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   This file defines Generic circular queue data structure definition
+ *
+ * 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!
+ * 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!!
+ *============================================================================
+ ****************************************************************************/
+/*******************************************************************************
+*  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) 2002
+*
+*******************************************************************************/
+
+/*********************************************************************
+   (C) _____ (year of first publication) Sasken communication
+   Technologies Limited, All rights reserved.
+*   This file provides a template for .c files. This space
+*   should be used to describe the file contents
+*   Component-specific prefix : xxxx
+*********************************************************************/
+ 
+#ifndef _LCD_IP_CQUEUE_H
+#define _LCD_IP_CQUEUE_H
+
+/*************************************************************************
+ * Include the common header file
+ *************************************************************************/
+#if defined(__MTK_TARGET__)
+#include "kal_itc.h"
+#else
+#include "kal_hrt_api.h"
+#endif
+
+/*************************************************************************
+ * Macros With Parameters
+ *************************************************************************/
+#if defined(__MTK_TARGET__)
+#define LCD_IP_CQUEUE_MT_LOCK(_lock)                                 \
+    unsigned int irq_status = 0, mt_status = 0, prio = 0;            \
+    KAL_ITC_LOCK_TAKE_DI_DMT_PRIO(_lock, irq_status, mt_status, prio)
+
+#define LCD_IP_CQUEUE_MT_UNLOCK(_lock)                               \
+    KAL_ITC_LOCK_GIVE_EI_EMT_PRIO((_lock), irq_status, mt_status, prio)
+#else
+#define LCD_IP_CQUEUE_MT_LOCK(_lock)                                 \
+    kal_hrt_take_itc_lock(KAL_ITC_ISR_Q, KAL_INFINITE_WAIT)
+
+#define LCD_IP_CQUEUE_MT_UNLOCK(_lock)                               \
+    kal_hrt_give_itc_lock(KAL_ITC_ISR_Q)
+#endif
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE
+*
+* DESCRIPTION
+*
+* PARAMETERS
+*  _type is the type of item to be put in queue.
+* _length is the size of the queue.
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+
+#define LCD_IP_CQUEUE(_type, _length)                                \
+    struct {                                                         \
+        unsigned int    head;                                        \
+        unsigned int    tail;                                        \
+        unsigned int    multiple;                                    \
+        unsigned int    max_used_item;                               \
+        unsigned int    total_item;                                  \
+        kal_bool        is_full;                                     \
+        _type           queue[_length];                              \
+    }
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_INIT
+*
+* DESCRIPTION
+*
+* PARAMETERS
+*  _q is the structure variable of the queue
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+
+#define LCD_IP_CQUEUE_INIT(_q)                                       \
+do{                                                                  \
+    (_q).head = (_q).tail = 0;                                       \
+    (_q).multiple = 1;                                               \
+    (_q).max_used_item = 0;                                          \
+    (_q).total_item = (sizeof((_q).queue)*(_q).multiple / sizeof((_q).queue[0]));  \
+    (_q).is_full = KAL_FALSE;                                        \
+}while(0)
+
+#define LCD_IP_CQUEUE_INIT_N(_q, n)                                  \
+do{                                                                  \
+    (_q).head = (_q).tail = 0;                                       \
+    (_q).multiple = n;                                               \
+    (_q).max_used_item = 0;                                          \
+    (_q).total_item = (sizeof((_q).queue)*(_q).multiple / sizeof((_q).queue[0]));  \
+    (_q).is_full = KAL_FALSE;                                        \
+}while(0)
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_INSERT
+*
+* DESCRIPTION
+*
+* PARAMETERS
+*  _q is the structure variable of the queue
+*  _item is the item to be inserted  to the queue
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+/* (_q).tail = ((_q).tail + 1) % (sizeof((_q).queue)*(_q).multiple/sizeof((_q).queue[0])); */
+#define LCD_IP_CQUEUE_INSERT(_q, _item)                              \
+do{                                                                  \
+    (_q).queue[(_q).tail] = _item;                                   \
+    (_q).tail++;                                                     \
+    if ((_q).tail == (_q).total_item)                                \
+        (_q).tail = 0;                                               \
+    if ((_q).head == (_q).tail) { (_q).is_full = KAL_TRUE; }         \
+}while(0)
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_INSERT_DISCARD
+*
+* DESCRIPTION
+*
+* PARAMETERS
+*  _q is the structure variable of the queue
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+
+#define LCD_IP_CQUEUE_INSERT_DISCARD(_q)                             \
+do{                                                                  \
+    /* (_q).queue[(_q).tail] = _item; */                             \
+    (_q).tail++;                                                     \
+    if ((_q).tail == (_q).total_item)                                \
+        (_q).tail = 0;                                               \
+    if ((_q).head == (_q).tail) { (_q).is_full = KAL_TRUE; }         \
+}while(0)
+
+/************************************************************************* 
+ * FUNCTION 
+ *  LCD_IP_CQUEUE_INSERT_HEAD 
+ * 
+ * DESCRIPTION 
+ * 
+ * PARAMETERS 
+ *  _q is the structure variable of the queue 
+ *  _item is the item to be inserted  to the queue 
+ * 
+ * RETURNS 
+ * 
+ * GLOBALS AFFECTED 
+ * 
+ *************************************************************************/ 
+
+#define LCD_IP_CQUEUE_INSERT_HEAD(_q, _item)                         \
+do{                                                                  \
+    if((_q).head == 0) {(_q).head = (_q).total_item; }               \
+    (_q).head--;                                                     \
+    (_q).queue[(_q).head] = _item;                                   \
+    if ((_q).head == (_q).tail) { (_q).is_full = KAL_TRUE; }         \
+}while(0)
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_REMOVE
+*
+* DESCRIPTION
+*
+* PARAMETERS
+*  _q is the structure variable of the queue
+*  _item is the variable to which removed item is stored
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+/*(_q).head = ((_q).head + 1) % (sizeof((_q).queue)*(_q).multiple/sizeof((_q).queue[0]));*/
+
+#define LCD_IP_CQUEUE_REMOVE(_q, _item)                              \
+do{                                                                  \
+    _item = (_q).queue[(_q).head];                                   \
+    (_q).head++;                                                     \
+    if((_q).head == (_q).total_item)                                 \
+        (_q).head = 0;                                               \
+    if ((_q).is_full == KAL_TRUE)                                    \
+        (_q).is_full = KAL_FALSE;                                    \
+}while(0)
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_DISCARD
+*
+* DESCRIPTION
+* Just for removing last node from CQUEUE
+*
+* PARAMETERS
+*  _q is the structure variable of the queue
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+/*(_q).head = ((_q).head + 1) % (sizeof((_q).queue)*(_q).multiple/sizeof((_q).queue[0]));*/
+#define LCD_IP_CQUEUE_DISCARD(_q)                                    \
+do{                                                                  \
+    /*_item = (_q).queue[(_q).head];*/                               \
+    (_q).head++;                                                     \
+    if((_q).head == (_q).total_item)                                 \
+        (_q).head = 0;                                               \
+    if ((_q).is_full == KAL_TRUE)                                    \
+        (_q).is_full = KAL_FALSE;                                    \
+}while(0)
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_NUM_OF_ITEMS
+*
+* DESCRIPTION
+*
+* PARAMETERS
+* _q is the structure variable of the queue
+* _num_of_items is the variable to which the
+* number of items in the queue is assigned
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+
+#define LCD_IP_CQUEUE_NUM_OF_ITEMS(_q,_num_of_items)                 \
+do{                                                                  \
+    if((_q).is_full)                                                 \
+        _num_of_items = (_q).total_item;                             \
+    else if((_q).tail >= (_q).head)                                  \
+        _num_of_items = (_q).tail - (_q).head;                       \
+    else                                                             \
+        _num_of_items = (_q).tail + (_q).total_item - (_q).head;     \
+}while(0)
+
+#define LCD_IP_CQUEUE_RETURN_NUM_OF_ITEMS(_q)                        \
+    ((_q).is_full ? ((_q).total_item) :                              \
+        ((_q).tail >= (_q).head ? ((_q).tail - (_q).head) :          \
+        ((_q).tail + (_q).total_item - (_q).head)))
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_INDEX
+*
+* DESCRIPTION
+*
+* PARAMETERS
+* _q is the structure variable of the queue
+* _index is the index position of the queue from which queue item to be accessed
+* _item is the variable to which element at index is stored.
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+
+#define LCD_IP_CQUEUE_INDEX(_q,_index,_item)                         \
+do{                                                                  \
+    if(((_q).head + _index) > ((_q).total_item - 1))                 \
+    {                                                                \
+        /*user need to ensure index must be in scope [0,q->size-1], which is the valid-scope*/ \
+        ASSERT(((_q).head + _index - (_q).total_item) <= ((_q).total_item - 1)); \
+        _item = (_q).queue[(_q).head + _index - (_q).total_item];    \
+    }                                                                \
+    else                                                             \
+        _item = (_q).queue[(_q).head + _index];                      \
+}while(0)
+
+
+#define LCD_IP_CQUEUE_UPDATE_MAX(_q, _max)                           \
+do{                                                                  \
+    LCD_IP_CQUEUE_NUM_OF_ITEMS(_q, _max);                            \
+    if (_max > (_q).max_used_item)                                   \
+    {                                                                \
+        (_q).max_used_item = _max;                                   \
+    }                                                                \
+    else if (_max < (_q).max_used_item)                              \
+    {                                                                \
+        _max = (_q).max_used_item;                                   \
+    }                                                                \
+}while(0)
+
+#define LCD_UP_CQUEUE_UPDATE_MAX(_q, _max) LCD_IP_CQUEUE_UPDATE_MAX(_q, _max)
+
+/* _q is the structure variable of the queue */
+#define LCD_IP_CQUEUE_IS_FULL(_q)  ((_q).is_full)
+#define LCD_IP_CQUEUE_IS_EMPTY(_q) (((_q).head == (_q).tail) && !(_q).is_full)
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_MT
+*
+* DESCRIPTION
+*
+* PARAMETERS
+*  _type is the type of item to be put in queue.
+* _length is the size of the queue.
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+#define LCD_IP_CQUEUE_MT(_type, _length)                             \
+    struct {                                                         \
+        unsigned int     head;                                       \
+        unsigned int     tail;                                       \
+        unsigned int     multiple;                                   \
+        unsigned int     max_used_item;                              \
+        unsigned int     total_item;                                 \
+        unsigned int     lock_flag;                                  \
+        kal_bool         is_full;                                    \
+        _type            queue[_length];                             \
+    }
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_INIT_MT
+*
+* DESCRIPTION
+*
+* PARAMETERS
+*  _q is the structure variable of the queue
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+
+#define LCD_IP_CQUEUE_INIT_N_MT(_q, n)                               \
+    do{                                                              \
+        (_q).head = (_q).tail = 0;                                   \
+        (_q).multiple = n;                                           \
+        (_q).max_used_item = 0;                                      \
+        (_q).total_item = (sizeof((_q).queue)*(_q).multiple / sizeof((_q).queue[0])); \
+        (_q).lock_flag = 0;                                          \
+        (_q).is_full = KAL_FALSE;                                    \
+    }while(0)
+
+#define LCD_IP_CQUEUE_INIT_MT(_q) LCD_IP_CQUEUE_INIT_N_MT(_q, 1)
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_INSERT_MT
+*
+* DESCRIPTION
+*
+* PARAMETERS
+*  _q is the structure variable of the queue
+*  _item is the item to be inserted to the queue
+*  _is_full is the queue full flag before insert item
+*
+* RETURNS
+*  _is_full
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+
+#define LCD_IP_CQUEUE_INSERT_MT(_q, _item, _is_full)                 \
+do{                                                                  \
+    LCD_IP_CQUEUE_MT_LOCK((_q).lock_flag);                           \
+    if (!LCD_IP_CQUEUE_IS_FULL(_q)) {                                \
+        _is_full = KAL_FALSE;                                        \
+        LCD_IP_CQUEUE_INSERT(_q, _item);                             \
+    } else {                                                         \
+        _is_full = KAL_TRUE;                                         \
+    }                                                                \
+    LCD_IP_CQUEUE_MT_UNLOCK((_q).lock_flag);                         \
+}while(0)
+
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_INSERT_DISCARD_MT
+*
+* DESCRIPTION
+*
+* PARAMETERS
+*  _q is the structure variable of the queue
+*  _is_full is the queue full flag before insert item
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+
+#define LCD_IP_CQUEUE_INSERT_DISCARD_MT(_q, _is_full)                \
+do{                                                                  \
+    LCD_IP_CQUEUE_MT_LOCK((_q).lock_flag);                           \
+    if (!LCD_IP_CQUEUE_IS_FULL(_q)) {                                \
+        _is_full = KAL_FALSE;                                        \
+        LCD_IP_CQUEUE_INSERT_DISCARD(_q);                            \
+    } else {                                                         \
+        _is_full = KAL_TRUE;                                         \
+    }                                                                \
+    LCD_IP_CQUEUE_MT_UNLOCK((_q).lock_flag);                         \
+}while(0)
+
+
+/************************************************************************* 
+ * FUNCTION 
+ *  LCD_IP_CQUEUE_INSERT_HEAD_MT
+ * 
+ * DESCRIPTION 
+ * 
+ * PARAMETERS 
+ *  _q is the structure variable of the queue 
+ *  _item is the item to be inserted  to the queue 
+ *  _is_full is the queue full flag before insert item
+ *
+ * RETURNS
+ *  _is_full
+ * 
+ * GLOBALS AFFECTED 
+ * 
+ *************************************************************************/ 
+
+#define LCD_IP_CQUEUE_INSERT_HEAD_MT(_q, _item, _is_full)            \
+do{                                                                  \
+    LCD_IP_CQUEUE_MT_LOCK((_q).lock_flag);                           \
+    if (!LCD_IP_CQUEUE_IS_FULL(_q)) {                                \
+        _is_full = KAL_FALSE;                                        \
+        LCD_IP_CQUEUE_INSERT_HEAD(_q, _item);                        \
+    } else {                                                         \
+        _is_full = KAL_TRUE;                                         \
+    }                                                                \
+    LCD_IP_CQUEUE_MT_UNLOCK((_q).lock_flag);                         \
+}while(0)
+
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_REMOVE_MT
+*
+* DESCRIPTION
+*
+* PARAMETERS
+*  _q is the structure variable of the queue
+*  _item is the variable to which removed item is stored
+*  _is_empty is the queue empty flag before remove item
+*
+* RETURNS
+*  _is_empty
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+
+#define LCD_IP_CQUEUE_REMOVE_MT(_q, _item, _is_empty)                \
+do{                                                                  \
+    LCD_IP_CQUEUE_MT_LOCK((_q).lock_flag);                           \
+    if (!LCD_IP_CQUEUE_IS_EMPTY(_q)) {                               \
+        _is_empty = KAL_FALSE;                                       \
+        LCD_IP_CQUEUE_REMOVE(_q, _item);                             \
+    } else {                                                         \
+        _is_empty = KAL_TRUE;                                        \
+    }                                                                \
+    LCD_IP_CQUEUE_MT_UNLOCK((_q).lock_flag);                         \
+}while(0)
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_DISCARD_MT
+*
+* DESCRIPTION
+* Just for removing last node from CQUEUE
+*
+* PARAMETERS
+*  _q is the structure variable of the queue
+*  _is_empty is the queue empty flag before remove item
+*
+* RETURNS
+*  _is_empty
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+
+#define LCD_IP_CQUEUE_DISCARD_MT(_q, _is_empty)                      \
+do{                                                                  \
+    LCD_IP_CQUEUE_MT_LOCK((_q).lock_flag);                           \
+    if (!LCD_IP_CQUEUE_IS_EMPTY(_q)) {                               \
+        _is_empty = KAL_FALSE;                                       \
+        LCD_IP_CQUEUE_DISCARD(_q);                                   \
+    } else {                                                         \
+        _is_empty = KAL_TRUE;                                        \
+    }                                                                \
+    LCD_IP_CQUEUE_MT_UNLOCK((_q).lock_flag);                         \
+}while(0)
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_NUM_OF_ITEMS_MT
+*
+* DESCRIPTION
+*
+* PARAMETERS
+* _q is the structure variable of the queue
+* _num_of_items is the variable to which the
+* number of items in the queue is assigned
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+
+#define LCD_IP_CQUEUE_NUM_OF_ITEMS_MT(_q,_num_of_items)              \
+do{                                                                  \
+    LCD_IP_CQUEUE_MT_LOCK((_q).lock_flag);                           \
+    if((_q).is_full)                                                 \
+        _num_of_items = (_q).total_item;                             \
+    else if((_q).tail >= (_q).head)                                  \
+        _num_of_items = (_q).tail - (_q).head;                       \
+    else                                                             \
+        _num_of_items = (_q).tail + (_q).total_item - (_q).head;     \
+    LCD_IP_CQUEUE_MT_UNLOCK((_q).lock_flag);                         \
+}while(0)
+
+/*************************************************************************
+* FUNCTION
+*  LCD_IP_CQUEUE_INDEX_MT
+*
+* DESCRIPTION
+*
+* PARAMETERS
+* _q is the structure variable of the queue
+* _index is the index position of the queue from which queue item to be accessed
+* _item is the variable to which element at index is stored.
+*  _is_full is the queue full flag before insert item
+*  _is_empty is the queue empty flag before remove item
+*
+* RETURNS
+*  _is_full, _is_empty
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+
+#define LCD_IP_CQUEUE_INDEX_MT(_q,_index,_item, _is_full, _is_empty) \
+do{                                                                  \
+    LCD_IP_CQUEUE_MT_LOCK((_q).lock_flag);                           \
+    if (LCD_IP_CQUEUE_IS_FULL(_q))                                   \
+        _is_full = KAL_TRUE;                                         \
+    else                                                             \
+        _is_full = KAL_FALSE;                                        \
+    if (LCD_IP_CQUEUE_IS_EMPTY(_q) || (_index >= LCD_IP_CQUEUE_RETURN_NUM_OF_ITEMS(_q))) \
+        _is_empty = KAL_TRUE;                                        \
+    else                                                             \
+        _is_empty = KAL_FALSE;                                       \
+    LCD_IP_CQUEUE_INDEX(_q,_index,_item);                            \
+    LCD_IP_CQUEUE_MT_UNLOCK((_q).lock_flag);                         \
+}while(0)
+
+#define LCD_IP_CQUEUE_IS_FULL_MT(_q, _is_full)                       \
+do{                                                                  \
+    LCD_IP_CQUEUE_MT_LOCK((_q).lock_flag);                           \
+    _is_full = LCD_IP_CQUEUE_IS_FULL(_q);                            \
+    LCD_IP_CQUEUE_MT_UNLOCK((_q).lock_flag);                         \
+}while(0)
+
+#define LCD_IP_CQUEUE_IS_EMPTY_MT(_q, _is_empty)                     \
+do{                                                                  \
+    LCD_IP_CQUEUE_MT_LOCK((_q).lock_flag);                           \
+    _is_empty = LCD_IP_CQUEUE_IS_EMPTY(_q);                          \
+    LCD_IP_CQUEUE_MT_UNLOCK((_q).lock_flag);                         \
+}while(0)
+
+
+#endif /* _LCD_IP_CQUEUE_H */
diff --git a/mcu/interface/service/stacklib/lcd_lqueue.h b/mcu/interface/service/stacklib/lcd_lqueue.h
new file mode 100644
index 0000000..6bb8aca
--- /dev/null
+++ b/mcu/interface/service/stacklib/lcd_lqueue.h
@@ -0,0 +1,238 @@
+/*****************************************************************************
+*  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:
+ * ---------
+ *   lcd_lqueue.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   Light weight C Data structures library: Linear Queue.
+ *
+ * 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!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+/*********************************************************************
+   (C) _____ (year of first publication) Sasken communication
+   Technologies Limited, All rights reserved.
+*   This file provides a template for .c files. This space
+*   should be used to describe the file contents
+*   Component-specific prefix : xxxx
+*********************************************************************/
+ 
+#ifndef _LCD_LQUEUE_H
+#define _LCD_LQUEUE_H
+/*RHR*/
+#include "kal_general_types.h"
+//#include "stacklib.h"
+#include "lcd.h"
+#include "kal_public_api.h"
+/*RHR*/
+/*************************************************************************
+ * Macros Without Parameters
+ *************************************************************************/
+#define  BIN_OVERHEAD             2
+
+/*************************************************************************
+ * Data  structure definition
+ *************************************************************************/
+typedef enum {
+    NOT_SET,
+    BY_FN_P,
+    BY_USR_MEM
+}mem_for_items;
+
+/*************************************************************************
+ * Arbitrary Size Linear Queue
+ *************************************************************************/
+
+/* This queue works by maintaining a doubly linked list of bins of
+ * size bin_size, when the current bin is full a new bin is allocated
+ * and chained to the end of the current bin. Likewise when the last
+ * item in a bin is removed and the next bin is there, the current
+ * bin is freed and the head is moved to the first item in the next
+ * bin. See figure given bellow.
+ *
+ *         ____      ____      ____      ____
+ *        |    |    |    |    |    |    |    |
+ *        |____|    |____|    |____|    |____|
+ * head ->|    |    |    |    |    |    |    |
+ *        |____|    |____|    |____|    |____|
+ *        |    |    |    |    |    |    |    | <- tail
+ *        |____|    |____|    |____|    |____|
+ *        |    |    |    |    |    |    |    |
+ *        |____|<---|____|<---|____|<---|____|
+ *        |    |    |    |    |    |    |    |
+ *        |____|    |____|    |____|    |____|
+ *            |______^  |______^  |_______^
+ *
+ */
+
+typedef void * * lcd_lqueue_bin;
+
+typedef struct lcd_lqueue {
+    unsigned int       bin_size;
+         /* The first bin. */
+    lcd_lqueue_bin     start;
+         /* The position of the head within the bin. */
+    unsigned int       head;
+         /* The last bin. */
+    lcd_lqueue_bin     end;
+         /* The position of the tail within the bin. */
+    unsigned int       tail;
+         /* Number of bins allocated so far. */
+    unsigned int       bin_count;
+         /* Indicates the type of memory for items. */
+    mem_for_items      item_mem;
+    kal_bool           is_empty;
+    malloc_fp_t        alloc_fn_p;
+    free_fp_t          free_fn_p;
+} lcd_lqueue;
+
+/*************************************************************************
+ * Exported Function Prototypes
+ *************************************************************************/
+extern void lcd_lqueue_init(unsigned int bin_size, 
+                            malloc_fp_t alloc_fn_p,
+                            free_fp_t free_fn_p, 
+                            lcd_lqueue *q);
+
+extern kal_uint32 lcd_lqueue_mem_size(unsigned int bin_size);
+
+extern kal_bool lcd_lqueue_insert_at_rear(lcd_lqueue    *q,
+                                          void          *item);
+
+extern kal_bool lcd_lqueue_insert_at_front(lcd_lqueue    *q,
+                                           void          *item);
+
+/* The following function will be removed once variable
+ * length array is implemented.
+ */
+extern void *lcd_lqueue_remove(lcd_lqueue *q, void **mem_to_free);
+
+extern void *lcd_lqueue_remove_rear(lcd_lqueue *q, void **mem_to_free);
+
+extern kal_bool lcd_lqueue_is_empty(lcd_lqueue *q);
+
+extern unsigned int lcd_lqueue_num_of_items(lcd_lqueue *q);
+
+extern void  *lcd_lqueue_index(lcd_lqueue *q, unsigned int idx);
+
+extern void lcd_lqueue_map(lcd_lqueue *q, lcd_mapfunc f, void *info);
+
+/* The following function is a conditional map function
+ * which stop mapping items when function 'f' returns
+ * KAL_FALSE.If mapping is done for all items, it returns
+ * KAL_TRUE, else returns KAL_FALSE.
+ */
+extern kal_bool lcd_lqueue_cmap(lcd_lqueue *q, lcd_cmapfunc f, void *info);
+
+extern void lcd_lqueue_delete_all(lcd_lqueue *q);
+
+#ifdef _DEBUG_LCD_LQUEUE
+extern void lcd_lqueue_print(lcd_lqueue    *q);
+#endif
+#endif /* _LCD_LQUEUE_H */
+
+
diff --git a/mcu/interface/service/stacklib/stacklib.h b/mcu/interface/service/stacklib/stacklib.h
new file mode 100644
index 0000000..2e27d5c
--- /dev/null
+++ b/mcu/interface/service/stacklib/stacklib.h
@@ -0,0 +1,114 @@
+/*****************************************************************************
+*  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:
+ * ---------
+ *   stacklib.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   flc_data_struct
+ *
+ * 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!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+ 
+#ifndef _STACKLIB_H
+#define _STACKLIB_H
+
+/*************************************************************************
+ * Type Definitions
+ *************************************************************************/
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+/*************************************************************************
+ * Type Definitions
+ *************************************************************************/
+#include "lcd.h"
+#include "lcd_cqueue.h"
+// #include "lcd_dll.h" //remove lcd_dll, replaced by ./mcu/kal/mlib/mlib_dll
+#include "lcd_lqueue.h"
+
+#endif /* _STACKLIB_H */
+
+