[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/service/mertos/include/mer_config_public.h b/mcu/service/mertos/include/mer_config_public.h
new file mode 100644
index 0000000..d0f08ae
--- /dev/null
+++ b/mcu/service/mertos/include/mer_config_public.h
@@ -0,0 +1,86 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_config_public.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Define the mertos config allocation feature option
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+
+#ifndef _MER_CONFIG_PUBLIC_H_
+#define _MER_CONFIG_PUBLIC_H_
+
+#define __MER_CONFIG_ENABLE__
+
+#if defined(__KTEST__)
+#define __MER_CONFIG_USE_STATIC_ALLOCATION__
+#else
+#define __MER_CONFIG_USE_DYNAMIC_ALLOCATION__
+#endif
+
+/* Integrity test */
+/* These two options should be exclusive */
+#if defined(__MER_CONFIG_USE_STATIC_ALLOCATION__) && defined(__MER_CONFIG_USE_DYNAMIC_ALLOCATION__)
+#error "Only one config can be chosen"
+#endif
+
+#if !defined(__MER_CONFIG_USE_STATIC_ALLOCATION__) && !defined(__MER_CONFIG_USE_DYNAMIC_ALLOCATION__)
+#error "At least one config should be chosen"
+#endif
+
+/* When __SINGLE_CORE__ is defined, init flow only decalre the vpe0 stack */
+/* This violates MERTOS compile time assertion, so we decalre it by ourselve */
+#if !defined(__SINGLE_CORE__)
+#define __MER_CONFIG_USE_SYSTEM_STACK_IN_INIT__
+#endif
+
+#endif /* _MER_CONFIG_PUBLIC_H_ */
+
+
diff --git a/mcu/service/mertos/include/mer_kernel.h b/mcu/service/mertos/include/mer_kernel.h
new file mode 100644
index 0000000..6dce111
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel.h
@@ -0,0 +1,237 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare kernel related structure and API.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_H_
+#define _MER_KERNEL_H_
+
+#include "mer_kernel_config_public.h"
+#include "mer_service_types.h"
+#include "mer_config_public.h"
+
+#include "mips_ia_utils_public.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// Macro
+///////////////////////////////////////////////////////////////////////////////
+#define MER_KERNEL_SYSTEM_STACK_SIZE (8192)
+#define MER_KERNEL_ORIGIN_JOB 0x0
+#define MER_KERNEL_JOB_SWITCHED 0x1
+#define MER_KERNEL_OS_INTERRUPT 0x2
+
+/* For iA, according to ABI, stack should at least align 8 byte */
+/* For shaolin, according to ABI, stack should at least align 16 byte */
+/* For watchpoint, the minimal protection interval should be at least 32 byte */
+/* So we use the L.C.M: 32 */
+#define MER_KERNEL_STACK_ALIGN 32
+
+#if !defined(__MER_CONFIG_ENABLE__)
+#error "must include mer_config_public.h"
+#endif /* __MER_CONFIG_ENABLE__ */
+
+#if defined(__MER_CONFIG_USE_SYSTEM_STACK_IN_INIT__)
+#define mer_kernel_system_stack_vpe0 SYS_Stack_Pool_CORE0_VPE0_TC0
+#define mer_kernel_system_stack_vpe1 SYS_Stack_Pool_CORE0_VPE1_TC2
+#define mer_kernel_system_stack_vpe2 SYS_Stack_Pool_CORE0_VPE2_TC4
+#define mer_kernel_system_stack_vpe3 SYS_Stack_Pool_CORE1_VPE0_TC0
+#define mer_kernel_system_stack_vpe4 SYS_Stack_Pool_CORE1_VPE1_TC2
+#define mer_kernel_system_stack_vpe5 SYS_Stack_Pool_CORE1_VPE2_TC4
+#define mer_kernel_system_stack_vpe6 SYS_Stack_Pool_CORE2_VPE0_TC0
+#define mer_kernel_system_stack_vpe7 SYS_Stack_Pool_CORE2_VPE1_TC2
+#define mer_kernel_system_stack_vpe8 SYS_Stack_Pool_CORE2_VPE2_TC4
+#define mer_kernel_system_stack_vpe9 SYS_Stack_Pool_CORE3_VPE0_TC0
+#define mer_kernel_system_stack_vpe10 SYS_Stack_Pool_CORE3_VPE1_TC2
+#define mer_kernel_system_stack_vpe11 SYS_Stack_Pool_CORE3_VPE2_TC4
+#endif
+
+
+
+/* The threshold (in micro second) that a preempted task or dpc being migrated to other VPE */
+//#define MER_KERNEL_JOB_MIGRATION_THRESHOLD 200
+#define MER_KERNEL_JOB_MIGRATION_THRESHOLD 0xFFFFFFFF
+
+#if defined(__MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__)
+
+ #define MER_KERNEL_GET_INTERRUPT_COUNT_ASM(reg) \
+ mfc0 reg, $4, 2
+
+ #define MER_KERNEL_GET_INTERRUPT_COUNT() \
+ (miu_mfc0(MIU_C0_USERLOCAL))
+
+ #define MER_KERNEL_SET_INTERRUPT_COUNT(value) \
+ do {\
+ miu_mtc0(MIU_C0_USERLOCAL, (value));\
+ }while(0)
+
+ #define MER_KERNEL_GET_CURRENT_CONTROL_BLOCK() \
+ (miu_mfc0(MIU_C0_TCCONTEXT))
+
+ #define MER_KERNEL_SET_CURRENT_CONTROL_BLOCK(value) \
+ miu_mtc0(MIU_C0_TCCONTEXT, (value))
+
+#endif
+
+#if !MER_KERNEL_IS_ASSEMBLY
+///////////////////////////////////////////////////////////////////////////////
+// Macro
+///////////////////////////////////////////////////////////////////////////////
+#if defined(__MD97__) || defined(__MD97P__)
+ #define MER_KERNEL_OS_INTERRUPT_SW_CODE_BASE SW_TRIGGER_CODE53
+#else
+ #error "Unsupport platform"
+#endif
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Porting variable
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// Enum
+///////////////////////////////////////////////////////////////////////////////
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Structure
+///////////////////////////////////////////////////////////////////////////////
+
+typedef struct isr_info {
+ mer_uint32 start_time;
+ mer_uint32 preempted_time;
+ struct isr_info *previous_ptr;
+} mer_kernel_isr_info;
+
+///////////////////////////////////////////////////////////////////////////////
+// External variable
+///////////////////////////////////////////////////////////////////////////////
+extern mer_uint32 mer_kernel_initialize_flag;
+extern volatile mer_uint32 mer_kernel_os_interrupt_pending_mask;
+extern mer_uint32 mer_kernel_interrupt_count[MIPS_HW_VPE_NUM];
+
+extern mer_uint32 mer_kernel_system_stack_vpe0[];
+extern mer_uint32 mer_kernel_system_stack_vpe1[];
+extern mer_uint32 mer_kernel_system_stack_vpe2[];
+extern mer_uint32 mer_kernel_system_stack_vpe3[];
+extern mer_uint32 mer_kernel_system_stack_vpe4[];
+extern mer_uint32 mer_kernel_system_stack_vpe5[];
+extern mer_uint32 mer_kernel_system_stack_vpe6[];
+extern mer_uint32 mer_kernel_system_stack_vpe7[];
+extern mer_uint32 mer_kernel_system_stack_vpe8[];
+extern mer_uint32 mer_kernel_system_stack_vpe9[];
+extern mer_uint32 mer_kernel_system_stack_vpe10[];
+extern mer_uint32 mer_kernel_system_stack_vpe11[];
+///////////////////////////////////////////////////////////////////////////////
+// External functions
+///////////////////////////////////////////////////////////////////////////////
+extern void mer_kernel_initialization();
+extern void mer_kernel_isr_job_management(mer_uint32 isr_index, mer_uint32 vpe_id);
+extern void mer_kernel_isr_job_management_end(mer_uint32 isr_index, mer_uint32 vpe_id);
+extern void mer_kernel_enter_scheduling();
+extern void mer_kernel_initialization_phase0();
+extern void mer_kernel_osipi_handler();
+///////////////////////////////////////////////////////////////////////////////
+// static inline functions
+///////////////////////////////////////////////////////////////////////////////
+static inline mer_uint32 mer_kernel_is_initialized(){
+ return mer_kernel_initialize_flag;
+}
+
+#include "kal_hrt_api.h"
+#include "ex_public.h"
+static inline mer_uint32 mer_kernel_is_interrupt_enabled()
+{
+ mer_uint32 ibit;
+ mer_bool is_in_mt = kal_hrt_if_lisr_mt();
+ mer_bool is_in_init = kal_query_systemInit();
+ mer_bool is_in_exception = INT_QueryExceptionStatus();
+
+ do {
+ __asm__ __volatile__("" :
+ :
+ : "memory");
+ }while(0);
+
+ __asm__ __volatile__("mfc0 %0, $12\n\t"
+ "andi %0, 0x1\n\t"
+ : "=d"(ibit));
+
+ return is_in_mt || is_in_init || is_in_exception || ibit;
+}
+
+#if !defined(__MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__)
+mer_uint32 mer_kernel_interrupt_count[MIPS_HW_VPE_NUM];
+#endif
+
+static inline mer_uint32 mer_kernel_get_interrupt_count()
+{
+#if defined(__MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__)
+ mer_uint32 irq_count = MER_KERNEL_GET_INTERRUPT_COUNT();
+#else
+ mer_uint32 irq_count = mer_kernel_interrupt_count[mer_kernel_utility_get_current_vpe_id()];
+#endif
+
+ return irq_count;
+}
+
+static inline void mer_kernel_set_interrupt_count(mer_uint32 irq_count)
+{
+#if defined(__MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__)
+ MER_KERNEL_SET_INTERRUPT_COUNT(irq_count);
+#else
+ mer_kernel_interrupt_count[mer_kernel_utility_get_current_vpe_id()] = irq_count;
+#endif /* __MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__ */
+}
+
+#endif /* MER_KERNEL_IS_ASSEMBLY */
+#endif /* _MER_KERNEL_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_config_public.h b/mcu/service/mertos/include/mer_kernel_config_public.h
new file mode 100644
index 0000000..6e38144
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_config_public.h
@@ -0,0 +1,49 @@
+
+#ifndef _MER_KERNEL_CONFIG_PUBLIC_H_
+#define _MER_KERNEL_CONFIG_PUBLIC_H_
+
+#include "cpu_info.h"
+
+/* Compile time assertion */
+/**
+ * To check whether a condition is true at compile time.
+ * If the check passed, nothing will happen. Otherwise, a compiler error will be issued.
+ * @note Please ensure all the information required by the expression are compile-time decided.
+ * @param[in] cond The condition expression
+ * @sa MOS_CASSERT_MSG
+ */
+#define MER_CASSERT(cond) MER_CASSERT_MSG(cond, fail)
+#define MER_CASSERT_MSG(cond, msg) _MER_CASSERT_MSG1(cond, msg, __LINE__)
+#define _MER_CASSERT_MSG1(cond, msg, line) _MER_CASSERT_MSG2(cond, msg, line)
+#define _MER_CASSERT_MSG2(cond, msg, line) typedef char static_assertion_##msg##_at_line_##line[(!!(cond))*2-1]
+
+#define mer_dbg_print(...)
+
+/* VPE number of MERTOS */
+#define MIPS_HW_VPE_NUM SYS_MCU_NUM_VPE
+
+/* For asm/C shared header file definition */
+#define MER_KERNEL_IS_ASSEMBLY defined(__ASSEMBLER__)
+
+#define MER_BUILTIN_UNREACHABLE() __builtin_unreachable()
+//#define MER_BUILTIN_UNREACHABLE() ASSERT(0)
+
+#define __MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__
+
+#define __MER_KERNEL_RELEASE_VERSION__
+
+//#define MER_KERNEL_TEST_ASSERT(expr) ASSERT(expr)
+#define MER_KERNEL_TEST_ASSERT(expr)
+
+//#define __MER_KERNEL_DYNAMIC_BALANCE_JOB__
+#define __MER_KERNEL_ISR_LATENCY_SPEED_UP__
+//#define __MER_KERNEL_ISR_ENABLE_IBIT_WHEN_EXIT__
+//#define __MER_KERNEL_SCHEDULER_STRICT_PRIORITY_CONTROL__
+//#define __MER_KERNEL_SCHEDULER_BALANCE_MULTI_CORE_AFFINITY_JOB__
+
+#define __MER_KERNEL_SCHEDULER_SUPPORT_SOFT_AFFINITY__
+
+/* Special optimization that only for MCU */
+#define __MER_KERNEL_MCU_VERSION__
+
+#endif /* _MER_KERNEL_CONFIG_PUBLIC_H_ */
diff --git a/mcu/service/mertos/include/mer_kernel_dpc.h b/mcu/service/mertos/include/mer_kernel_dpc.h
new file mode 100644
index 0000000..b5f050f
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_dpc.h
@@ -0,0 +1,189 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_dpc.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* The DPC header
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_DPC_H_
+#define _MER_KERNEL_DPC_H_
+
+#include "mer_service_types.h"
+#include "mer_service_task.h"
+#include "mer_kernel_utility.h"
+#include "mer_kernel_config_public.h"
+#include "mer_kernel_scheduler.h"
+#include "mer_kernel_switch_target.h"
+#include "mer_config_public.h"
+#include <stddef.h>
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Porting variable
+///////////////////////////////////////////////////////////////////////////////
+typedef mer_service_dpc_cb mer_kernel_dpc_cb;
+
+extern mer_kernel_dpc_cb mer_kernel_dpc_info_table[];
+
+extern const mer_uint32 mer_kernel_dpc_num;
+extern const mer_uint32 mer_kernel_dpc_priority_num;
+extern const mer_uint32 mer_kernel_dpc_priority_mask_num;
+///////////////////////////////////////////////////////////////////////////////
+// Compile time assertion check
+///////////////////////////////////////////////////////////////////////////////
+
+/* Make sure the sp is the first element in the control block */
+MER_CASSERT(offsetof(mer_kernel_dpc_cb, stack_ptr) == 0);
+
+#if defined(__MD97__) || defined(__MD97P__)
+#include "mer_kernel_switch_target_shaolin.inc"
+MER_CASSERT(offsetof(mer_kernel_dpc_cb, last_execution_vpe) == MER_KERNEL_SWITCH_LAST_EXE_VPE_OFFSET);
+#endif /* defined(__MD97__) || defined(__MD97P__) */
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Macro
+///////////////////////////////////////////////////////////////////////////////
+#define MER_KERNEL_DPC_LEVEL_BIT (30)
+#define MER_KERNEL_DPC_LEVEL_MASK (1 << MER_KERNEL_DPC_LEVEL_BIT)
+#define MER_KERNEL_DPC_NUM (mer_kernel_dpc_num)
+//#define MER_KERNEL_DPC_MASK_NUM ((MER_KERNEL_DPC_NUM / 32) + (MER_KERNEL_DPC_NUM % 32 != 0))
+#define MER_KERNEL_DPC_PRIORITY_NUM (mer_kernel_dpc_priority_num)
+#define MER_KERNEL_DPC_PRIORITY_MASK_NUM (mer_kernel_dpc_priority_mask_num)
+#define MER_KERNEL_DPC_APPEND_PRIORITY(dpc_id) ((1 << MER_KERNEL_DPC_LEVEL_BIT) | (dpc_id))
+
+///////////////////////////////////////////////////////////////////////////////
+// Typedef
+///////////////////////////////////////////////////////////////////////////////
+typedef struct {
+ mer_uint32 *mask;
+} mer_kernel_dpc_mask;
+
+typedef struct {
+ mer_uint8 head;
+ mer_uint8 tail;
+} mer_kernel_dpc_list;
+
+typedef mer_uint8 mer_kernel_dpc_id;
+
+///////////////////////////////////////////////////////////////////////////////
+// Enum
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// Structure
+///////////////////////////////////////////////////////////////////////////////
+
+extern mer_kernel_dpc_mask mer_kernel_dpc_pending_mask[];
+extern mer_kernel_dpc_list mer_kernel_dpc_priority_list[][MIPS_HW_VPE_NUM];
+
+extern mer_uint32 mer_kernel_dpc_info_table_begin;
+extern mer_uint32 mer_kernel_dpc_info_table_end;
+
+///////////////////////////////////////////////////////////////////////////////
+// External Function
+///////////////////////////////////////////////////////////////////////////////
+void mer_kernel_dpc_remove(mer_uint32 dpc_id);
+void mer_kernel_dpc_insert(mer_uint32 dpc_id);
+void mer_kernel_dpc_insert_to_head(mer_uint32 dpc_id);
+void mer_kernel_dpc_set_running_state(mer_uint32 dpc_id);
+void mer_kernel_dpc_initialization();
+void mer_kernel_dpc_invoke(mer_uint32 dpc_id);
+void mer_kernel_dpc_invoke_in_hrt_isr(mer_uint32 dpc_id);
+void mer_kernel_dpc_change_current_affinity(mer_uint32 affinity_mask);
+void mer_kernel_dpc_set_affinity_to_current_vpe();
+
+#if defined(__MER_CONFIG_USE_DYNAMIC_ALLOCATION__)
+void mer_kernel_dpc_stack_allocation();
+#endif /* __MER_CONFIG_USE_DYNAMIC_ALLOCATION__ */
+
+/**
+ * Return the dpc index with cb pointer
+ *
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] Index of input cb pointer
+ * @param[in] The dpc pointer
+ *
+ */
+static inline mer_uint32 mer_kernel_dpc_get_index(mer_kernel_dpc_cb *cb){
+
+ //return (mer_uint32)(cb - mer_kernel_dpc_info_table);
+ return (mer_uint32)cb->job_index;
+}
+
+/**
+ * Return the current running dpc index
+ * Note that this function assume the schedule lock is taken
+ *
+ * Unless __MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__ is defined
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] The current dpc id
+ * @param[in] vpe_id
+ *
+ */
+__attribute__((always_inline)) static inline mer_uint32 mer_kernel_dpc_get_current_index(){
+
+#if defined(__MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__)
+ mer_kernel_dpc_cb *cb = (mer_kernel_dpc_cb *)(MER_KERNEL_GET_CURRENT_CONTROL_BLOCK());
+ return mer_kernel_dpc_get_index(cb);
+#else
+ mer_uint32 current_vpe = mer_kernel_utility_get_current_vpe_id();
+ return mer_kernel_scheduler_running_job[current_vpe].job_index;
+#endif /* __MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__ */
+}
+
+
+
+#endif /* _MER_KERNEL_DPC_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_lock_target.h b/mcu/service/mertos/include/mer_kernel_lock_target.h
new file mode 100644
index 0000000..27cef3c
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_lock_target.h
@@ -0,0 +1,68 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_lock_target.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Define the target dependent API for different platform
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_LOCK_TARGET_H_
+#define _MER_KERNEL_LOCK_TARGET_H_
+
+#include "mer_service_types.h"
+
+#if defined(__MD97__) || defined(__MD97P__)
+ #include "mer_kernel_lock_target_shaolin.h"
+#else
+ #error "Unsupport platform"
+#endif
+
+
+#endif /* _MER_KERNEL_LOCK_TARGET_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_lock_target_mips.h b/mcu/service/mertos/include/mer_kernel_lock_target_mips.h
new file mode 100644
index 0000000..02d0a1b
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_lock_target_mips.h
@@ -0,0 +1,175 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_lock_target_mips.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Define MIPS dependent lock API
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_LOCK_TARGET_MIPS_H_
+#define _MER_KERNEL_LOCK_TARGET_MIPS_H_
+
+#include "mer_kernel_config_public.h"
+#include "mer_service_types.h"
+#include "mer_kernel_utility_target.h"
+#include "kal_public_api.h"
+#include "kal_profiling.h" // for performance profiling
+
+#define __MER_KERNEL_LOCK_DEBUG__
+
+
+
+typedef struct {
+ mer_uint32 lock;
+ mer_uint32 owner;
+#if defined(__MER_KERNEL_LOCK_DEBUG__)
+ mer_uint32 caller;
+#endif
+ mer_uint32 irq_status;
+} mer_kernel_lock_id;
+
+typedef struct{
+ char* where;
+ mer_uint32 timestamp;
+ mer_uint32 task_cb;
+ mer_uint32 info;
+ mer_uint32 lr;
+ mer_uint32 irq_count;
+ mer_uint32 vpe;
+} mer_kernel_di_log;
+
+
+#define DBG_COUNT 128
+extern mer_kernel_di_log di_debug_queue[MIPS_HW_VPE_NUM][DBG_COUNT];
+extern mer_uint32 di_debug_count[MIPS_HW_VPE_NUM];
+
+
+///////////////////////////////////////////////////////////////////////////////
+// External Function
+///////////////////////////////////////////////////////////////////////////////
+extern void mer_kernel_lock_take(mer_kernel_lock_id *lock);
+extern void mer_kernel_lock_release_with_ei(mer_kernel_lock_id *lock);
+extern void mer_kernel_lock_release_with_di(mer_kernel_lock_id *lock);
+extern void mer_kernel_lock_take_schedule_in_api();
+extern void mer_kernel_lock_take_with_di(mer_kernel_lock_id *lock);
+
+///////////////////////////////////////////////////////////////////////////////
+// External Variable
+///////////////////////////////////////////////////////////////////////////////
+extern mer_kernel_lock_id mer_kernel_schedule_lock;
+
+///////////////////////////////////////////////////////////////////////////////
+// Static Function
+///////////////////////////////////////////////////////////////////////////////
+/**
+ * atomic read
+ *
+ * @param[out] value
+ * @param[in] address
+ *
+ */
+static inline mer_uint32 mer_kernel_lock_atmoic_read(mer_uint32 *ptr){
+
+ mer_uint32 ret_value = 0;
+ __asm__ __volatile__(
+ "ll %0, 0(%1) \n" \
+ :"=d"(ret_value) \
+ :"d"(ptr) \
+ :"memory" \
+ );
+
+ return ret_value;
+}
+
+/**
+ * atomic write
+ *
+ * @param[out] result
+ * @param[in] address
+ *
+ */
+static inline mer_uint32 mer_kernel_lock_atomic_write(mer_uint32 *ptr, mer_uint32 result){
+
+ __asm__ __volatile__(
+ "sc %0, 0(%1) \n" \
+ :"=d"(result) \
+ :"d"(ptr), "0"(result) \
+ :"memory" \
+ );
+
+ return result;
+}
+
+static inline mer_bool mer_kernel_lock_take_schedule_try(){
+
+ mer_uint32 ll_value = mer_kernel_lock_atmoic_read(&mer_kernel_schedule_lock.lock);
+ if (ll_value == 1){
+ return MER_FALSE;
+ }
+
+ mer_uint32 sc_result = mer_kernel_lock_atomic_write(&mer_kernel_schedule_lock.lock, 1);
+
+ if(sc_result == 0){
+ return MER_FALSE;
+ }
+
+ mer_kernel_schedule_lock.owner = mer_kernel_utility_get_current_vpe_id();
+ mer_kernel_schedule_lock.irq_status = 1;
+
+ #if defined(__MER_KERNEL_LOCK_DEBUG__)
+ mer_kernel_schedule_lock.caller = 0;
+ #endif
+
+ return MER_TRUE;
+
+}
+
+
+#endif /* _MER_KERNEL_LOCK_TARGET_MIPS_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_lock_target_shaolin.h b/mcu/service/mertos/include/mer_kernel_lock_target_shaolin.h
new file mode 100644
index 0000000..e29be5a
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_lock_target_shaolin.h
@@ -0,0 +1,194 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_lock_target_mips.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Define shaolin dependent lock API
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_LOCK_TARGET_MIPS_H_
+#define _MER_KERNEL_LOCK_TARGET_MIPS_H_
+
+#include "mer_kernel_config_public.h"
+#include "mer_service_types.h"
+#include "mer_kernel_utility_target.h"
+#include "kal_public_api.h"
+#include "kal_profiling.h" // for performance profiling
+
+#define __MER_KERNEL_LOCK_DEBUG__
+
+
+
+typedef struct {
+ mer_uint32 lock;
+ mer_uint32 owner;
+#if defined(__MER_KERNEL_LOCK_DEBUG__)
+ mer_uint32 caller;
+#endif
+ mer_uint32 irq_status;
+} mer_kernel_lock_id;
+
+typedef struct{
+ char* where;
+ mer_uint32 timestamp;
+ mer_uint32 task_cb;
+ mer_uint32 info;
+ mer_uint32 lr;
+ mer_uint32 irq_count;
+ mer_uint32 vpe;
+} mer_kernel_di_log;
+
+
+#define DBG_COUNT 128
+extern mer_kernel_di_log di_debug_queue[MIPS_HW_VPE_NUM][DBG_COUNT];
+extern mer_uint32 di_debug_count[MIPS_HW_VPE_NUM];
+
+
+///////////////////////////////////////////////////////////////////////////////
+// External Function
+///////////////////////////////////////////////////////////////////////////////
+extern void mer_kernel_lock_take(mer_kernel_lock_id *lock);
+extern void mer_kernel_lock_release_with_ei(mer_kernel_lock_id *lock);
+extern void mer_kernel_lock_release_with_di(mer_kernel_lock_id *lock);
+extern void mer_kernel_lock_take_schedule_in_api();
+extern void mer_kernel_lock_take_with_di(mer_kernel_lock_id *lock);
+extern void mer_kernel_lock_release_in_mt(mer_kernel_lock_id *lock);
+extern void mer_kernel_lock_take_in_mt(mer_kernel_lock_id *lock);
+
+///////////////////////////////////////////////////////////////////////////////
+// External Variable
+///////////////////////////////////////////////////////////////////////////////
+extern mer_kernel_lock_id mer_kernel_schedule_lock;
+
+///////////////////////////////////////////////////////////////////////////////
+// Static Function
+///////////////////////////////////////////////////////////////////////////////
+/**
+ * atomic read
+ *
+ * @param[out] value
+ * @param[in] address
+ *
+ */
+static inline mer_uint32 mer_kernel_lock_atmoic_read(mer_uint32 *ptr){
+
+ mer_uint32 ret_value = 0;
+ __asm__ __volatile__(
+ "ll %0, 0(%1) \n" \
+ :"=d"(ret_value) \
+ :"d"(ptr) \
+ :"memory" \
+ );
+
+ return ret_value;
+}
+
+/**
+ * atomic write
+ *
+ * @param[out] result
+ * @param[in] address
+ *
+ */
+static inline mer_uint32 mer_kernel_lock_atomic_write(mer_uint32 *ptr, mer_uint32 result){
+
+ __asm__ __volatile__(
+ "sc %0, 0(%1) \n" \
+ :"=d"(result) \
+ :"d"(ptr), "0"(result) \
+ :"memory" \
+ );
+
+ return result;
+}
+
+static inline mer_bool mer_kernel_lock_take_schedule_try(){
+
+ mer_uint32 ll_value = mer_kernel_lock_atmoic_read(&mer_kernel_schedule_lock.lock);
+ if (ll_value == 1){
+ return MER_FALSE;
+ }
+
+ mer_uint32 sc_result = mer_kernel_lock_atomic_write(&mer_kernel_schedule_lock.lock, 1);
+
+ if(sc_result == 0){
+ return MER_FALSE;
+ }
+
+ mer_kernel_schedule_lock.owner = mer_kernel_utility_get_current_vpe_id();
+ mer_kernel_schedule_lock.irq_status = 1;
+
+ #if defined(__MER_KERNEL_LOCK_DEBUG__)
+ mer_kernel_schedule_lock.caller = 0;
+ #endif
+
+ return MER_TRUE;
+
+}
+
+static inline mer_bool mer_kernel_lock_take_try(mer_kernel_lock_id *lock){
+
+ mer_uint32 ll_value = mer_kernel_lock_atmoic_read(&lock->lock);
+ if (ll_value == 1){
+ return MER_FALSE;
+ }
+
+ mer_uint32 sc_result = mer_kernel_lock_atomic_write(&lock->lock, 1);
+
+ if(sc_result == 0){
+ return MER_FALSE;
+ }
+
+ return MER_TRUE;
+
+}
+
+
+#endif /* _MER_KERNEL_LOCK_TARGET_MIPS_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_scheduler.h b/mcu/service/mertos/include/mer_kernel_scheduler.h
new file mode 100644
index 0000000..8eca4e3
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_scheduler.h
@@ -0,0 +1,429 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_scheduler.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* MERTOS scheduler header
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_SCHEDULER_H_
+#define _MER_KERNEL_SCHEDULER_H_
+#include "mer_kernel_config_public.h"
+
+#if defined(__MD97__) || defined(__MD97P__)
+
+#define MER_KERNEL_SCHEDULER_WAKE_UP_STATE 0x2
+#define MER_KERNEL_SCHEDULER_BUSY_STATE 0x0
+#define MER_KERNEL_SCHEDULER_IDLE_STATE 0x1
+
+#define MER_KERNEL_SCHEDULER_CORE0_MASK 0x7
+#define MER_KERNEL_SCHEDULER_CORE1_MASK 0x38
+
+#else
+ #error "unsupport platform"
+#endif /* __MD97__ || __MD97P__ */
+
+#define MER_KERNEL_SCHEDULER_JOB_INDEX_MASK (0xFFFFFFF)
+#define MER_KERNEL_SCHEDULER_JOB_PRIORITY_MASK (~(MER_KERNEL_SCHEDULER_JOB_INDEX_MASK))
+
+#define MER_KERNEL_SCHEDULER_LOCK_IS_RELEASED (0x0)
+#define MER_KERNEL_SCHEDULER_LOCK_IS_NOT_RELEASED (0x1)
+
+//#define __MER_KERNEL_SCHEDULER_ENCODE_DI_PRIORITY__
+
+#ifndef MER_KERNEL_IS_ASSEMBLY
+ #error "please include public header"
+#endif /* MER_KERNEL_IS_ASSEMBLY */
+
+#if !MER_KERNEL_IS_ASSEMBLY
+
+#include "mer_service_types.h"
+#include "mer_kernel_utility_target.h"
+#include "mer_kernel.h"
+#include "mer_kernel_dpc.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// Internal type
+///////////////////////////////////////////////////////////////////////////////
+typedef struct {
+ mer_uint32 priority;
+ mer_uint32 affinity_mask;
+ mer_uint32 job_index;
+ mer_uint32 self_adjust;
+} mer_kernel_scheduler_job;
+
+typedef void (*mer_kernel_scheduler_job_callback)(mer_uint32);
+//typedef void (*mer_kernel_scheduler_set_job_callback)(mer_uint32);
+
+typedef enum {
+ MER_KERNEL_SCHEDULER_INSERT_TO_HEAD = 0,
+ MER_KERNEL_SCHEDULER_INSERT_TO_TAIL = 2,
+ MER_KERNEL_SCHEDULER_INSERT_TO_HEAD_AND_RETURN = 0x10,
+ MER_KERNEL_SCHEDULER_INSERT_TO_TAIL_AND_RETURN = 0x12,
+} mer_kernel_scheduler_job_insert_type;
+
+typedef enum {
+ MER_KERNEL_SCHEDULER_CONTEXT_TASK = 1,
+ MER_KERNEL_SCHEDULER_CONTEXT_DPC = 2,
+ MER_KERNEL_SCHEDULER_CONTEXT_ISR = 3,
+ MER_KERNEL_SCHEDULER_CONTEXT_NONE = 4,
+} mer_kernel_scheduler_context_type;
+
+///////////////////////////////////////////////////////////////////////////////
+// External Variable
+///////////////////////////////////////////////////////////////////////////////
+extern mer_kernel_scheduler_job mer_kernel_scheduler_running_job[MIPS_HW_VPE_NUM];
+extern mer_kernel_scheduler_job mer_kernel_scheduler_ready_job[MIPS_HW_VPE_NUM];
+extern mer_kernel_scheduler_job_callback mer_kernel_scheduler_job_insert[];
+extern mer_uint32 mer_kernel_scheduler_idle_flag_mips[MIPS_HW_VPE_NUM];
+
+extern mer_uint32 mer_kernel_dpc_info_table_begin;
+extern mer_uint32 mer_kernel_dpc_info_table_end;
+extern mer_uint32 mer_kernel_task_info_table_begin;
+extern mer_uint32 mer_kernel_task_info_table_end;
+
+///////////////////////////////////////////////////////////////////////////////
+// External Function
+///////////////////////////////////////////////////////////////////////////////
+extern void mer_kernel_scheduler_reschedule_job();
+mer_uint32 mer_kernel_scheduler_insert_job(mer_uint32 new_job_priority,
+ mer_uint32 new_job_affinity_mask,
+ mer_uint32 new_job_index,
+ mer_kernel_scheduler_job_insert_type new_job_insert_position);
+void mer_kernel_scheduler_switch_local_job(mer_uint32 current_vpe);
+void mer_kernel_scheduler_adjust_priority(mer_uint32 current_vpe);
+
+/* Low power */
+mer_uint32 mer_kernel_scheduler_remove_vpes_from_scheduling();
+void mer_kernel_scheduler_restore_current_vpe_to_scheduling(mer_uint32 core);
+void mer_kernel_scheduler_set_slave_vpe_idle_flag();
+void mer_kernel_scheduler_remove_slave_vpe_idle_flag();
+
+void mer_kernel_scheduler_initialization();
+
+mer_kernel_scheduler_context_type mer_kernel_scheduler_get_current_context_level();
+
+///////////////////////////////////////////////////////////////////////////////
+// Static Inline Function
+///////////////////////////////////////////////////////////////////////////////
+/**
+ * Check whether the job priority of VPE is in ISR
+ * Time complexity O(1)
+ *
+ * @param[out] 1 if in ISR, otherwise 0 if in DPC/Task
+ * @param[in] priority
+ *
+ */
+static inline mer_uint32 mer_kernel_scheduler_is_in_isr(mer_uint32 priority){
+
+ mer_uint32 non_isr_mask = 0xC0000000;
+ return ((priority & non_isr_mask) == 0);
+}
+
+/**
+ * Encode DI to current running priority
+ * Time complexity O(1)
+ *
+ * @param[out] current_vpe
+ * @param[in] N/A
+ *
+ */
+static inline void mer_kernel_scheduler_di(mer_uint32 current_vpe){
+
+#if defined(__MER_KERNEL_SCHEDULER_ENCODE_DI_PRIORITY__)
+#error "should not compile"
+#if defined(__MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__)
+ if (MER_KERNEL_GET_INTERRUPT_COUNT()){
+#else
+ if (mer_kernel_interrupt_count[current_vpe]){
+#endif /* __MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__ */
+ return;
+ }
+
+ mer_uint32 priority = mer_kernel_scheduler_running_job[current_vpe].priority;
+ mer_uint32 level_mask = ((priority & (~MER_KERNEL_SCHEDULER_JOB_INDEX_MASK)) >> 2);
+ mer_uint32 job_mask = (priority & MER_KERNEL_SCHEDULER_JOB_INDEX_MASK);
+
+ mer_kernel_scheduler_running_job[current_vpe].priority = level_mask | job_mask;
+ mer_kernel_utility_coherence_sync();
+
+#endif /* __MER_KERNEL_SCHEDULER_ENCODE_DI_PRIORITY__ */
+}
+
+/**
+ * Encode EI to current running priority
+ * Time complexity O(1)
+ *
+ * @param[out] N/A
+ * @param[in] current_vpe
+ *
+ */
+static inline void mer_kernel_scheduler_ei(mer_uint32 current_vpe){
+
+#if defined(__MER_KERNEL_SCHEDULER_ENCODE_DI_PRIORITY__)
+#error "should not compile"
+#if defined(__MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__)
+ if (MER_KERNEL_GET_INTERRUPT_COUNT()){
+#else
+ if (mer_kernel_interrupt_count[current_vpe]){
+#endif /* __MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__ */
+
+ mer_uint32 priority = mer_kernel_scheduler_running_job[current_vpe].priority;
+ mer_uint32 level_mask = ((priority & (~MER_KERNEL_SCHEDULER_JOB_INDEX_MASK)) << 2);
+ mer_uint32 job_mask = (priority & MER_KERNEL_SCHEDULER_JOB_INDEX_MASK);
+
+ mer_kernel_scheduler_running_job[current_vpe].priority = level_mask | job_mask;
+ mer_kernel_utility_coherence_sync();
+
+#endif /* __MER_KERNEL_SCHEDULER_ENCODE_DI_PRIORITY__ */
+
+}
+
+/**
+ * Set wake up status for child VPE (VPE1 in 93/95) before it reset
+ * Time complexity O(1)
+ *
+ * @param[out] N/A
+ * @param[in] N/A
+ *
+ */
+static inline void mer_kernel_scheduler_notify_child_vpe(){
+
+#if defined(__MD97__) || defined(__MD97P__)
+ mer_uint32 current_vpe = mer_kernel_utility_get_current_vpe_id();
+ mer_kernel_scheduler_idle_flag_mips[current_vpe+1] = MER_KERNEL_SCHEDULER_WAKE_UP_STATE;
+ mer_kernel_scheduler_idle_flag_mips[current_vpe+2] = MER_KERNEL_SCHEDULER_WAKE_UP_STATE;
+#else
+ #error "should porting to new platform"
+#endif
+
+}
+
+/**
+ * check if current context level is in dpc or not
+ * Time complexity O(1)
+ *
+ * @param[out] TRUE/FALSE
+ * @param[in] N/A
+ *
+ */
+__attribute__((always_inline)) static inline mer_uint32 mer_kernel_scheduler_is_in_dpc(){
+
+#if defined(__MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__)
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#else
+ /* Use the type in structure instead to have a better profiling result */
+ mer_uint32 control_block = MER_KERNEL_GET_CURRENT_CONTROL_BLOCK();
+ return ((MER_KERNEL_GET_INTERRUPT_COUNT() == 0) && \
+ (control_block) && \
+ (((mer_service_dpc_cb *)(control_block))->job_type == MER_SERVICE_TYPE_DPC));
+#endif
+#else
+ #error "should porting this part"
+#endif
+}
+
+/**
+ * check if current context level is in task or not
+ * Time complexity O(1)
+ *
+ * @param[out] TRUE/FALSE
+ * @param[in] N/A
+ *
+ */
+__attribute__((always_inline)) static inline mer_uint32 mer_kernel_scheduler_is_in_task(){
+
+#if defined(__MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__)
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#else
+ /* Use the type in structure instead to have a better profiling result */
+ mer_uint32 control_block = MER_KERNEL_GET_CURRENT_CONTROL_BLOCK();
+ return ((MER_KERNEL_GET_INTERRUPT_COUNT() == 0) && \
+ (control_block) && \
+ (((mer_service_dpc_cb *)(control_block))->job_type == MER_SERVICE_TYPE_TASK));
+#endif
+
+#else
+ #error "should porting this part"
+#endif
+}
+
+/**
+ * atomic read
+ *
+ * @param[out] value
+ * @param[in] address
+ *
+ */
+static inline mer_uint32 mer_kernel_scheduler_atmoic_read(mer_uint32 *ptr){
+
+ mer_uint32 ret_value = 0;
+ __asm__ __volatile__(
+ "ll %0, 0(%1) \n" \
+ :"=d"(ret_value) \
+ :"d"(ptr) \
+ :"memory" \
+ );
+
+ return ret_value;
+}
+
+/**
+ * atomic write
+ *
+ * @param[out] result
+ * @param[in] address
+ *
+ */
+static inline mer_uint32 mer_kernel_scheduler_atomic_write(mer_uint32 *ptr, mer_uint32 result){
+
+ __asm__ __volatile__(
+ "sc %0, 0(%1) \n" \
+ :"=d"(result) \
+ :"d"(ptr), "0"(result) \
+ :"memory" \
+ );
+
+ return result;
+}
+
+/**
+ * Wipe out the VPE running priority when entering ISR
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] N/A
+ * @param[in] vpe_id, job_stack_pointer
+ *
+ */
+__attribute__((always_inline)) static inline void mer_kernel_scheduler_enter_isr(mer_uint32 vpe_id, mer_uint32 job_stack_pointer)
+{
+ /* Note that we do not take schedule lock here since we DO NOT allow ignore
+ ISR priority. It means, when I am in ISR, NO other VPE will send OS
+ interrupt to me even when I am a extremely short ISR from idle.
+ By doing so, we can make sure when sending an interrupt, the target
+ should receive OS interrupt immediately (unless it disable interrupt)
+ This reduce the chance that multiple OS interrupt send to same VPE.
+ */
+
+
+#if defined(__MER_KERNEL_DYNAMIC_BALANCE_JOB__)
+ mer_uint32 *job_sp = (mer_uint32 *)(MER_KERNEL_GET_CURRENT_CONTROL_BLOCK());
+ *job_sp = job_stack_pointer;
+#else
+ mer_uint32 *job_sp = (mer_uint32 *)(MER_KERNEL_GET_CURRENT_CONTROL_BLOCK());
+ *job_sp = job_stack_pointer;
+#endif
+
+ mer_uint32 result;
+
+ do {
+ //mer_kernel_utility_coherence_sync();
+
+ mer_uint32 *ptr = &mer_kernel_scheduler_running_job[vpe_id].priority;
+
+ mer_uint32 ll_value = mer_kernel_scheduler_atmoic_read(ptr);
+
+ mer_uint32 level_mask = ((ll_value & (~MER_KERNEL_SCHEDULER_JOB_INDEX_MASK)) >> 2);
+ mer_uint32 job_mask = (ll_value & MER_KERNEL_SCHEDULER_JOB_INDEX_MASK);
+
+ result = mer_kernel_scheduler_atomic_write(ptr, (level_mask | job_mask));
+
+ }while(result == 0);
+
+ //mer_kernel_utility_coherence_sync();
+
+}
+
+/**
+ * Recover out the VPE running priority when leaving ISR
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] N/A
+ * @param[in] N/A
+ *
+ */
+__attribute__((always_inline)) static inline mer_bool mer_kernel_scheduler_recover_job_info(mer_uint32 vpe_id){
+
+ mer_uint32 result, self_reorder, ready_job = mer_kernel_scheduler_ready_job[vpe_id].priority;
+ mer_uint32 *ptr = &mer_kernel_scheduler_running_job[vpe_id].priority;
+
+ do {
+
+ mer_uint32 ll_value = mer_kernel_scheduler_atmoic_read(ptr);
+
+ mer_uint32 level_mask = ((ll_value & (~MER_KERNEL_SCHEDULER_JOB_INDEX_MASK)) << 2);
+ mer_uint32 job_mask = (ll_value & MER_KERNEL_SCHEDULER_JOB_INDEX_MASK);
+ mer_uint32 origin_mask = (level_mask | job_mask);
+
+ self_reorder = (ready_job < origin_mask);
+
+ result = mer_kernel_scheduler_atomic_write(ptr, origin_mask);
+
+ }while(result == 0);
+
+ return self_reorder;
+
+}
+
+#endif /* !MER_IS_ASSEMBLY */
+
+#endif /* _MER_KERNEL_SCHEDULER_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_switch_target.h b/mcu/service/mertos/include/mer_kernel_switch_target.h
new file mode 100644
index 0000000..e3647af
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_switch_target.h
@@ -0,0 +1,93 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_switch_target.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Define the target dependent context switch interface
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_SWITCH_TARGET_H_
+#define _MER_KERNEL_SWITCH_TARGET_H_
+
+#include "mer_kernel_config_public.h"
+#include "mer_service_types.h"
+#include "mer_kernel_switch_target_mips.h"
+
+typedef enum {
+ MER_KERNEL_SWITCH_FROM_SOURCE_TO_TARGET,
+ MER_KERNEL_SWITCH_TO_TARGET
+} mer_kernel_context_switch_type;
+
+extern void mer_kernel_switch_from_source_to_target_context(mer_uint32, mer_service_task_cb *, mer_service_task_cb *);
+extern void mer_kernel_switch_to_target_context(mer_uint32, mer_service_task_cb *);
+extern void mer_kernel_switch_to_kernel_and_adjust(mer_uint32);
+
+#define MER_KERNEL_SWITCH_GET_CONTEXT_LEVEL(cb) mer_kernel_switch_job_get_context_level((cb))
+#define MER_KERNEL_SWITCH_SET_CONTEXT_LEVEL(VPE, cb) mer_kernel_switch_set_context_level_cirq((VPE), (cb))
+
+/**
+ * Return the context level of job
+ * Time complexity O(1)
+ *
+ * @param[out] context_level
+ * @param[in] job control block
+ *
+ */
+static inline mer_uint32 mer_kernel_switch_job_get_context_level(mer_service_task_cb *cb)
+{
+ if (cb->job_type == MER_SERVICE_TYPE_TASK) {
+ return mer_kernel_switch_task_context_base + (cb->priority / MER_KERNEL_SWITCH_JOB_PER_GROUP);
+ }
+ else {
+ return ((mer_service_dpc_cb *)cb)->priority / MER_KERNEL_SWITCH_JOB_PER_GROUP;
+ }
+}
+
+#endif /* _MER_KERNEL_SWITCH_TARGET_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_switch_target_mips.h b/mcu/service/mertos/include/mer_kernel_switch_target_mips.h
new file mode 100644
index 0000000..3c64e42
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_switch_target_mips.h
@@ -0,0 +1,76 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_switch_target_mips.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Define the target dependent context switch interface
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_SWITCH_TARGET_MIPS_H_
+#define _MER_KERNEL_SWITCH_TARGET_MIPS_H_
+
+#include "mer_kernel_config_public.h"
+#include "mer_service_types.h"
+#include "mer_kernel_dpc.h"
+#include "mer_kernel_task.h"
+#include "mer_kernel_scheduler.h"
+#include "intrCtrl.h"
+
+
+#define MER_KERNEL_SWITCH_JOB_PER_GROUP 1
+#define MER_KERNEL_SWITCH_JOB_BASE VPE_STATUS_HISR_TASK_HIGHEST
+#define MER_KERNEL_SWITCH_JOB_MAX VPE_STATUS_HISR_TASK_LOWEST
+
+extern mer_uint32 mer_kernel_switch_task_context_base;
+extern void mer_kernel_switch_init();
+extern void mer_kernel_switch_set_context_level_cirq(mer_uint32 current_vpe, mer_service_task_cb *cb);
+extern mer_uint32 mer_kernel_switch_get_idle_context_level (mer_uint32 vpe_id);
+
+#endif /* _MER_KERNEL_SWITCH_TARGET_MIPS_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_switch_target_mips.inc b/mcu/service/mertos/include/mer_kernel_switch_target_mips.inc
new file mode 100644
index 0000000..6c68813
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_switch_target_mips.inc
@@ -0,0 +1,161 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_switch_target_mips.inc
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Define the necessary context switch global define
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_SWITCH_TARGET_MIPS_INC_
+#define _MER_KERNEL_SWITCH_TARGET_MIPS_INC_
+
+#include "mer_kernel_config_public.h"
+//#include <cps.h>
+
+#define MER_KERNEL_SWITCH_AT_OFFSET 0x0
+#define MER_KERNEL_SWITCH_V0_OFFSET 0x4
+#define MER_KERNEL_SWITCH_V1_OFFSET 0x8
+#define MER_KERNEL_SWITCH_A0_OFFSET 0xc
+#define MER_KERNEL_SWITCH_A1_OFFSET 0x10
+#define MER_KERNEL_SWITCH_A2_OFFSET 0x14
+#define MER_KERNEL_SWITCH_A3_OFFSET 0x18
+#define MER_KERNEL_SWITCH_T0_OFFSET 0x1c
+#define MER_KERNEL_SWITCH_T1_OFFSET 0x20
+#define MER_KERNEL_SWITCH_T2_OFFSET 0x24
+#define MER_KERNEL_SWITCH_T3_OFFSET 0x28
+#define MER_KERNEL_SWITCH_T4_OFFSET 0x2c
+#define MER_KERNEL_SWITCH_T5_OFFSET 0x30
+#define MER_KERNEL_SWITCH_T6_OFFSET 0x34
+#define MER_KERNEL_SWITCH_T7_OFFSET 0x38
+#define MER_KERNEL_SWITCH_T8_OFFSET 0x3c
+#define MER_KERNEL_SWITCH_T9_OFFSET 0x40
+#define MER_KERNEL_SWITCH_GP_OFFSET 0x44
+#define MER_KERNEL_SWITCH_RA_OFFSET 0x48
+#define MER_KERNEL_SWITCH_HI_OFFSET 0x4c
+#define MER_KERNEL_SWITCH_LO_OFFSET 0x50
+#define MER_KERNEL_SWITCH_VPEC_OFFSET 0x54
+#define MER_KERNEL_SWITCH_TCSCH_OFFSET 0x58
+#define MER_KERNEL_SWITCH_SR_OFFSET 0x5c
+#define MER_KERNEL_SWITCH_EPC_OFFSET 0x60
+#define MER_KERNEL_SWITCH_STACK_FRAME 0x64
+
+#define MER_KERNEL_SWITCH_STACK_CALLEE_FRAME 0x28
+
+#define MER_KERNEL_SWITCH_STACK_TOTAL_FRAME (MER_KERNEL_SWITCH_STACK_FRAME + MER_KERNEL_SWITCH_STACK_CALLEE_FRAME)
+#define MER_KERNEL_SWITCH_STACK_END_OFFSET 76
+
+#define MER_KERNEL_FUNC_BEGIN(name) \
+ .set nomips16 ;\
+ .text ;\
+ .globl name ;\
+ .ent name ;\
+ .set noreorder ;\
+ name: ;
+
+#define MER_KERNEL_FUNC_END(name) \
+ .set reorder ;\
+ .size name, . - name ;\
+ .end name ;
+
+#define MER_KERNEL_SWITCH_MT_AT_OFFSET 0x0
+#define MER_KERNEL_SWITCH_MT_V0_OFFSET 0x4
+#define MER_KERNEL_SWITCH_MT_V1_OFFSET 0x8
+#define MER_KERNEL_SWITCH_MT_A0_OFFSET 0xc
+#define MER_KERNEL_SWITCH_MT_A1_OFFSET 0x10
+#define MER_KERNEL_SWITCH_MT_A2_OFFSET 0x14
+#define MER_KERNEL_SWITCH_MT_A3_OFFSET 0x18
+#define MER_KERNEL_SWITCH_MT_T0_OFFSET 0x1c
+#define MER_KERNEL_SWITCH_MT_T1_OFFSET 0x20
+#define MER_KERNEL_SWITCH_MT_T2_OFFSET 0x24
+#define MER_KERNEL_SWITCH_MT_T3_OFFSET 0x28
+#define MER_KERNEL_SWITCH_MT_T4_OFFSET 0x2c
+#define MER_KERNEL_SWITCH_MT_T5_OFFSET 0x30
+#define MER_KERNEL_SWITCH_MT_T6_OFFSET 0x34
+#define MER_KERNEL_SWITCH_MT_T7_OFFSET 0x38
+#define MER_KERNEL_SWITCH_MT_T8_OFFSET 0x3c
+#define MER_KERNEL_SWITCH_MT_T9_OFFSET 0x40
+#define MER_KERNEL_SWITCH_MT_GP_OFFSET 0x44
+#define MER_KERNEL_SWITCH_MT_RA_OFFSET 0x48
+#define MER_KERNEL_SWITCH_MT_HI_OFFSET 0x4c
+#define MER_KERNEL_SWITCH_MT_LO_OFFSET 0x50
+/* No need to store VPE control register since it is for SMT */
+#define MER_KERNEL_SWITCH_MT_TCSCH_OFFSET 0x54
+/* No need to save EPC since child TC will not be interrupted */
+#define MER_KERNEL_SWITCH_MT_S0_OFFSET 0x58
+#define MER_KERNEL_SWITCH_MT_S1_OFFSET 0x5C
+#define MER_KERNEL_SWITCH_MT_S2_OFFSET 0x60
+#define MER_KERNEL_SWITCH_MT_S3_OFFSET 0x64
+#define MER_KERNEL_SWITCH_MT_S4_OFFSET 0x68
+#define MER_KERNEL_SWITCH_MT_S5_OFFSET 0x6c
+#define MER_KERNEL_SWITCH_MT_S6_OFFSET 0x70
+#define MER_KERNEL_SWITCH_MT_S7_OFFSET 0x74
+#define MER_KERNEL_SWITCH_MT_S8_OFFSET 0x78
+#define MER_KERNEL_SWITCH_MT_TCRST_OFFSET 0x7c
+#define MER_KERNEL_SWITCH_MT_TCHT_OFFSET 0x80
+#define MER_KERNEL_SWITCH_MT_STACK_FRAME 0x84
+
+
+#if MER_KERNEL_IS_ASSEMBLY
+
+/* External data symbol */
+.extern mer_kernel_interrupt_count
+.extern mer_kernel_require_reschedule_job
+.extern mer_kernel_system_stack_pointer
+.extern mer_kernel_lock_take_schedule_in_api
+
+/* External function symbol */
+.extern mer_kernel_isr_entry_point
+.extern mer_kernel_switch_restore_from_irq
+.extern mer_kernel_scheduler_reschedule_job
+
+#endif /* MER_KERNEL_IS_ASSEMBLY */
+
+
+
+#endif /* _MER_KERNEL_SWITCH_TARGET_MIPS_INC_ */
diff --git a/mcu/service/mertos/include/mer_kernel_switch_target_shaolin.inc b/mcu/service/mertos/include/mer_kernel_switch_target_shaolin.inc
new file mode 100644
index 0000000..0ae151e
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_switch_target_shaolin.inc
@@ -0,0 +1,120 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_switch_target_shaolin.inc
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Define the necessary context switch global define
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_SWITCH_TARGET_SHAOLIN_INC_
+#define _MER_KERNEL_SWITCH_TARGET_SHAOLIN_INC_
+
+#include "mer_kernel_config_public.h"
+//#include <cps.h>
+
+#define MER_KERNEL_SWITCH_AT_OFFSET 0x0
+#define MER_KERNEL_SWITCH_A4_OFFSET 0x4
+#define MER_KERNEL_SWITCH_A5_OFFSET 0x8
+#define MER_KERNEL_SWITCH_A0_OFFSET 0xc
+#define MER_KERNEL_SWITCH_A1_OFFSET 0x10
+#define MER_KERNEL_SWITCH_A2_OFFSET 0x14
+#define MER_KERNEL_SWITCH_A3_OFFSET 0x18
+#define MER_KERNEL_SWITCH_T0_OFFSET 0x1c
+#define MER_KERNEL_SWITCH_T1_OFFSET 0x20
+#define MER_KERNEL_SWITCH_T2_OFFSET 0x24
+#define MER_KERNEL_SWITCH_T3_OFFSET 0x28
+#define MER_KERNEL_SWITCH_T4_OFFSET 0x2c
+#define MER_KERNEL_SWITCH_T5_OFFSET 0x30
+#define MER_KERNEL_SWITCH_A6_OFFSET 0x34
+#define MER_KERNEL_SWITCH_A7_OFFSET 0x38
+#define MER_KERNEL_SWITCH_T8_OFFSET 0x3c
+#define MER_KERNEL_SWITCH_T9_OFFSET 0x40
+#define MER_KERNEL_SWITCH_GP_OFFSET 0x44
+#define MER_KERNEL_SWITCH_RA_OFFSET 0x48
+#define MER_KERNEL_SWITCH_VPEC_OFFSET 0x4c
+#define MER_KERNEL_SWITCH_TCSCH_OFFSET 0x50
+#define MER_KERNEL_SWITCH_SR_OFFSET 0x54
+#define MER_KERNEL_SWITCH_EPC_OFFSET 0x58
+#define MER_KERNEL_SWITCH_STACK_FRAME 0x60
+
+#define MER_KERNEL_SWITCH_STACK_CALLEE_FRAME 0x30
+
+#define MER_KERNEL_SWITCH_STACK_TOTAL_FRAME (MER_KERNEL_SWITCH_STACK_FRAME + MER_KERNEL_SWITCH_STACK_CALLEE_FRAME)
+
+#define MER_KERNEL_SWITCH_LAST_EXE_VPE_OFFSET 84
+
+#define MER_KERNEL_FUNC_BEGIN(name) \
+ .section .text.##name, "ax" ;\
+ .globl name ;\
+ .ent name ;\
+ name: ;
+
+#define MER_KERNEL_FUNC_END(name) \
+ .size name, . - name ;\
+ .end name ;
+
+
+#if MER_KERNEL_IS_ASSEMBLY
+
+/* External data symbol */
+.extern mer_kernel_interrupt_count
+.extern mer_kernel_require_reschedule_job
+.extern mer_kernel_system_stack_pointer
+.extern mer_kernel_lock_take_schedule_in_api
+
+/* External function symbol */
+.extern mer_kernel_isr_entry_point
+.extern mer_kernel_switch_restore_from_irq
+.extern mer_kernel_scheduler_reschedule_job
+
+#endif /* MER_KERNEL_IS_ASSEMBLY */
+
+
+
+#endif /* _MER_KERNEL_SWITCH_TARGET_SHAOLIN_INC_ */
diff --git a/mcu/service/mertos/include/mer_kernel_task.h b/mcu/service/mertos/include/mer_kernel_task.h
new file mode 100644
index 0000000..08f976f
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_task.h
@@ -0,0 +1,285 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_task.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare task related API header.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_TASK_H_
+#define _MER_KERNEL_TASK_H_
+
+#include "mer_kernel_config_public.h"
+#include "mer_kernel_scheduler.h"
+#include "mer_service_task.h"
+#include "mer_kernel_switch_target.h"
+#include "mer_kernel_lock_target.h"
+#include "mer_config_public.h"
+#include <stddef.h>
+
+///////////////////////////////////////////////////////////////////////////////
+// Porting variable
+///////////////////////////////////////////////////////////////////////////////
+typedef mer_service_task_cb mer_kernel_task_cb;
+
+/* Make sure the sp is the first element in the control block */
+MER_CASSERT(offsetof(mer_kernel_task_cb, stack_ptr) == 0);
+
+/* Make sure the offset of stack_end in the control block matches with ASM */
+#if defined(__MD97__) || defined(__MD97P__)
+#include "mer_kernel_switch_target_shaolin.inc"
+MER_CASSERT(offsetof(mer_kernel_task_cb, last_execution_vpe) == MER_KERNEL_SWITCH_LAST_EXE_VPE_OFFSET);
+#endif /* defined(__MD97__) || defined(__MD97P__) */
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Macro
+///////////////////////////////////////////////////////////////////////////////
+#define MER_KERNEL_TASK_LEVEL_BIT 31
+#define MER_KERNEL_TASK_LEVEL_MASK (1 << MER_KERNEL_TASK_LEVEL_BIT)
+#define MER_KERNEL_TASK_APPEND_PRIORITY(task_id) ((1 << MER_KERNEL_TASK_LEVEL_BIT) | (task_id))
+#define MER_KERNEL_TASK_REMOVE_PRIORITY(task_id) ((~(1 << MER_KERNEL_TASK_LEVEL_BIT)) & (task_id))
+#define MER_KERNEL_TASK_NUM mer_kernel_task_num
+#define MER_KERNEL_TASK_MASK_NUM mer_kernel_task_mask_num
+#define MER_KERNEL_TASK_TOP_MASK_NUM mer_kernel_task_top_mask_num
+
+/* context means it is either preempted by ISR or running */
+/* For task, it is either bit 31 or bit 29 */
+#define MER_KERNEL_TASK_CONTEXT_MASK (MER_KERNEL_TASK_LEVEL_MASK | (1 << (MER_KERNEL_TASK_LEVEL_BIT-2)))
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Enum
+///////////////////////////////////////////////////////////////////////////////
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Structure
+///////////////////////////////////////////////////////////////////////////////
+typedef struct {
+ mer_uint32 *mask;
+} mer_kernel_task_top_mask;
+
+typedef struct {
+ mer_uint32 *mask;
+} mer_kernel_task_mask;
+
+typedef mer_uint32 mer_kernel_task_id;
+///////////////////////////////////////////////////////////////////////////////
+// External variable
+///////////////////////////////////////////////////////////////////////////////
+
+extern mer_kernel_task_cb mer_kernel_task_info_table[];
+extern mer_uint8 mer_kernel_task_dummy_stack[];
+
+extern mer_kernel_task_top_mask mer_kernel_task_top_ready_mask[MIPS_HW_VPE_NUM];
+extern mer_kernel_task_mask mer_kernel_task_ready_mask[MIPS_HW_VPE_NUM];
+
+extern mer_uint32 mer_kernel_task_info_table_begin;
+extern mer_uint32 mer_kernel_task_info_table_end;
+
+extern mer_uint32 mer_kernel_task_idle_priority_begin;
+
+extern const mer_uint32 mer_kernel_task_num;
+extern const mer_uint32 mer_kernel_task_mask_num;
+extern const mer_uint32 mer_kernel_task_top_mask_num;
+
+///////////////////////////////////////////////////////////////////////////////
+// External functions
+///////////////////////////////////////////////////////////////////////////////
+void mer_kernel_task_remove(mer_kernel_task_id);
+void mer_kernel_task_insert(mer_kernel_task_id);
+void mer_kernel_task_set_running_state(mer_kernel_task_id task_id);
+void mer_kernel_task_update_ready_job(mer_uint32 vpe_id);
+void mer_kernel_task_suspend(mer_kernel_task_id task_id, mer_service_task_state suspend_reason);
+void mer_kernel_task_resume(mer_kernel_task_cb* cb, mer_service_task_state suspend_reason);
+void mer_kernel_task_initialization();
+void mer_kernel_task_default_main();
+void mer_kernel_task_set_priority(mer_kernel_task_id source, mer_kernel_task_id target_priority);
+void mer_kernel_task_change_current_affinity(mer_uint32 affinity_mask);
+void mer_kernel_task_set_affinity_to_current_vpe();
+void mer_kernel_task_resume_and_return(mer_kernel_task_cb* cb, mer_service_task_state suspend_reason);
+
+#if defined(__MER_CONFIG_USE_DYNAMIC_ALLOCATION__)
+void mer_kernel_task_stack_allocation();
+#endif /* __MER_CONFIG_USE_DYNAMIC_ALLOCATION__ */
+
+///////////////////////////////////////////////////////////////////////////////
+// Static inline functions
+///////////////////////////////////////////////////////////////////////////////
+/**
+ * Return the task priority by cb
+ * Note that this function assume the schedule lock is taken
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] The task priority
+ * @param[in] cb
+ *
+ */
+static inline mer_kernel_task_id mer_kernel_task_get_priority(mer_kernel_task_cb *cb){
+
+ return cb->priority;
+}
+
+/**
+ * Return the inheritor task index by cb
+ * Note that this function assume the schedule lock is taken
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] The inheritor task index
+ * @param[in] cb
+ *
+ */
+static inline mer_kernel_task_id mer_kernel_task_get_inheritor_task_index(mer_kernel_task_cb *cb){
+
+ return cb->inheritor_task_index;
+}
+
+/**
+ * Return the task index with cb pointer
+ *
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] Index of input cb pointer
+ * @param[in] The task pointer
+ *
+ */
+static inline mer_uint32 mer_kernel_task_get_index(mer_kernel_task_cb *cb){
+
+ //return (mer_uint32)(cb - mer_kernel_task_info_table);
+ return (mer_uint32) cb->job_index;
+}
+
+/**
+ * Return the current running task priority
+ * Note that this function assume the schedule lock is taken
+ *
+ * If we have private memory, no need lock anymore
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] The current task id
+ * @param[in] vpe_id
+ *
+ */
+static inline mer_kernel_task_id mer_kernel_task_get_current_priority(){
+#if defined(__MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__)
+ mer_kernel_task_cb *cb = (mer_kernel_task_cb *)(MER_KERNEL_GET_CURRENT_CONTROL_BLOCK());
+ return cb->priority;
+#else
+ mer_uint32 current_vpe = mer_kernel_utility_get_current_vpe_id();
+ return MER_KERNEL_TASK_REMOVE_PRIORITY(mer_kernel_scheduler_running_job[current_vpe].priority);
+#endif
+}
+/**
+ * Return the current running task index
+ * Note that this function assume the schedule lock is taken
+ *
+ * If we have private memory, no need lock anymore
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] The current task id
+ * @param[in] vpe_id
+ *
+ */
+__attribute__((always_inline)) static inline mer_kernel_task_id mer_kernel_task_get_current_index(){
+
+#if defined(__MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__)
+ mer_kernel_task_cb *cb = (mer_kernel_task_cb *)(MER_KERNEL_GET_CURRENT_CONTROL_BLOCK());
+ return mer_kernel_task_get_index(cb);
+#else
+ mer_uint32 current_vpe = mer_kernel_utility_get_current_vpe_id();
+ return mer_kernel_scheduler_running_job[current_vpe].job_index;
+#endif /* __MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__ */
+}
+
+/**
+ * Return the current running task cb pointer
+ * Note that this function assume the schedule lock is taken
+ *
+ * If we have private memory, no need lock anymore
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] cb pointer
+ * @param[in] vpe_id
+ *
+ */
+static inline mer_kernel_task_cb * mer_kernel_task_get_current_cb(){
+#if defined(__MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__)
+ return (mer_kernel_task_cb *)(MER_KERNEL_GET_CURRENT_CONTROL_BLOCK());
+#else
+ mer_uint32 current_vpe = mer_kernel_utility_get_current_vpe_id();
+ mer_uint32 job_index = mer_kernel_scheduler_running_job[current_vpe].job_index;
+ return &mer_kernel_task_info_table[job_index];
+#endif /* __MER_KERNEL_USE_MIPS_CP0_CONTEXT_REG__ */
+}
+
+/**
+ * Return the state of specified task control block
+ *
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] State of input cb pointer
+ * @param[in] The task pointer
+ *
+ */
+static inline mer_service_task_state mer_kernel_task_get_state(mer_kernel_task_cb *cb){
+
+ return cb->state;
+}
+
+#endif /* _MER_KERNEL_TASK_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_test.h b/mcu/service/mertos/include/mer_kernel_test.h
new file mode 100644
index 0000000..b03add7
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_test.h
@@ -0,0 +1,94 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_test.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare kernel test related structure and API.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_TEST_H_
+#define _MER_KERNEL_TEST_H_
+
+#include "mer_kernel_config_public.h"
+#include "mer_service_types.h"
+#include "mer_service_task.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// Macro
+///////////////////////////////////////////////////////////////////////////////
+
+
+#if !MER_KERNEL_IS_ASSEMBLY
+///////////////////////////////////////////////////////////////////////////////
+// Porting variable
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// Enum
+///////////////////////////////////////////////////////////////////////////////
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Structure
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// External variable
+///////////////////////////////////////////////////////////////////////////////
+
+
+///////////////////////////////////////////////////////////////////////////////
+// External functions
+///////////////////////////////////////////////////////////////////////////////
+extern void mer_kernel_clobber_all_and_trigger_isr(mer_uint32 base);
+extern void mer_kernel_clobber_callee_and_trigger_suspend(mer_uint32 base, mer_uint32 index, mer_service_task_state suspend_reason);
+
+#endif /* MER_KERNEL_IS_ASSEMBLY */
+#endif /* _MER_KERNEL_TEST_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_timer.h b/mcu/service/mertos/include/mer_kernel_timer.h
new file mode 100644
index 0000000..ae4a437
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_timer.h
@@ -0,0 +1,122 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_timer.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* The OS timer header
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_TIMER_H_
+#define _MER_KERNEL_TIMER_H_
+
+#include "mer_service_types.h"
+#include "mer_kernel_config_public.h"
+#include "us_timer.h"
+#include "kal_internal_api.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// Macro
+///////////////////////////////////////////////////////////////////////////////
+#define OSTD_MAX_VALUE 0xffffffff
+#define OSTD_MAX_SLEEP_VALUE MAX_SLEEP_TIME
+
+///////////////////////////////////////////////////////////////////////////////
+// External variable
+///////////////////////////////////////////////////////////////////////////////
+extern mer_uint32 mer_kernel_timer_initial_tick;
+#if !defined(__EVENT_BASED_TIMER__)
+extern mer_uint32 mer_kernel_timer_fake_global_tick;
+#endif
+///////////////////////////////////////////////////////////////////////////////
+// Compile time assertion check
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// Typedef
+///////////////////////////////////////////////////////////////////////////////
+typedef struct timer_tick_info{
+ mer_uint32 afn;
+ mer_uint32 ufn;
+ mer_uint32 delayed;
+ struct timer_tick_info *next_ptr;
+} mer_kernel_timer_tick_info;
+
+///////////////////////////////////////////////////////////////////////////////
+// Enum
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// Structure
+///////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// Static inline function
+///////////////////////////////////////////////////////////////////////////////
+static inline mer_uint32 mer_kernel_timer_tick_duration(mer_uint32 from, mer_uint32 to){
+ return ust_us_duration(from, to);
+}
+static inline mer_uint32 mer_kernel_timer_get_current_tick(){
+#if defined(__EVENT_BASED_TIMER__)
+ return USC_Get_TimeStamp();
+#else /* __EVENT_BASED_TIMER__ */
+ return mer_kernel_timer_fake_global_tick;
+#endif /* __EVENT_BASED_TIMER__ */
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// External Function
+///////////////////////////////////////////////////////////////////////////////
+void mer_kernel_timer_initialization();
+void mer_kernel_timer_register_tick_interrupt(mer_uint32 afn, mer_uint32 ufn, mer_kernel_timer_tick_info* timer_cb, mer_uint32 delayed);
+void mer_kernel_timer_get_sleep_afn_ufn(mer_uint32 *afn, mer_uint32 *ufn, mer_kernel_timer_tick_info* afn_cb, mer_kernel_timer_tick_info* ufn_cb);
+mer_uint32 mer_kernel_timer_remove_event(mer_kernel_timer_tick_info *cb);
+mer_uint32 mer_kernel_timer_sleep_available();
+mer_kernel_timer_tick_info* mer_kernel_timer_get_expired_cb();
+#endif /* _MER_KERNEL_TIMER_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_utility.h b/mcu/service/mertos/include/mer_kernel_utility.h
new file mode 100644
index 0000000..26c9181
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_utility.h
@@ -0,0 +1,79 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_utility.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* kernel related utility header
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_UTILITY_H_
+#define _MER_KERNEL_UTILITY_H_
+
+#include "mer_service_types.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// static inline function
+///////////////////////////////////////////////////////////////////////////////
+/**
+ * Return the mask[bit], keep it as inline function for future extension
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] N/A
+ * @param[in] mask, bit
+ *
+ */
+static inline mer_uint32 mer_kernel_utility_bit_test(mer_uint32 mask, mer_uint32 bit){
+
+ return (((mask) & (1<<bit)) != 0);
+}
+
+
+#endif /* _MER_KERNEL_UTILITY_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_utility_target.h b/mcu/service/mertos/include/mer_kernel_utility_target.h
new file mode 100644
index 0000000..bc4ed10
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_utility_target.h
@@ -0,0 +1,94 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_utility_target.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* define platform dependent API
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_UTILITY_TARGET_H_
+#define _MER_KERNEL_UTILITY_TARGET_H_
+
+#include "mer_service_types.h"
+#include "kal_public_api.h"
+#include "mer_kernel_utility_target_mips.h"
+#include "mer_kernel.h"
+
+#define MERTOS_UTILITY_CLZ(z) __builtin_clz((z))
+#define mer_kernel_utility_get_lsb(mask) (31 - MERTOS_UTILITY_CLZ((mask) & -(mask)))
+#define mer_kernel_utility_get_current_vpe_id() (kal_get_current_vpe_id())
+#define MER_KERNEL_UTILITY_LIKELY(expr) __builtin_expect(!!(expr), 1)
+#define MER_KERNEL_UTILITY_UNLIKELY(expr) __builtin_expect(!!(expr), 0)
+#define MER_KERNEL_UTILITY_ASSUME(cond) do { if (!(cond)) __builtin_unreachable(); } while (0)
+
+#define mer_kernel_utility_power_management(affinity_mask) \
+ mer_kernel_utility_power_management_mips(affinity_mask)
+
+#define MER_KERNEL_UTILITY_ORDERING_BARRIER() \
+ do { \
+ __asm__ __volatile__("" : \
+ : \
+ : "memory");\
+ }while(0)
+
+#define mer_kernel_utility_coherence_sync() \
+ do { \
+ miu_syncn(0x10); \
+ }while(0)
+
+#define mer_kernel_utility_os_interrupt(vpe) \
+ do {\
+ mer_kernel_os_interrupt_pending_mask |= (1 << (vpe)); \
+ mer_kernel_utility_os_interrupt_mips((vpe)); \
+ mer_kernel_utility_coherence_sync(); \
+ }while(0)
+
+
+#endif /* _MER_KERNEL_UTILITY_TARGET_H_ */
+
diff --git a/mcu/service/mertos/include/mer_kernel_utility_target_mips.h b/mcu/service/mertos/include/mer_kernel_utility_target_mips.h
new file mode 100644
index 0000000..16806ab
--- /dev/null
+++ b/mcu/service/mertos/include/mer_kernel_utility_target_mips.h
@@ -0,0 +1,98 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_kernel_utility_target.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* define platform dependent API
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_KERNEL_UTILITY_TARGET_MIPS_H_
+#define _MER_KERNEL_UTILITY_TARGET_MIPS_H_
+
+#include "mer_kernel_config_public.h"
+#include "mer_service_types.h"
+#include "kal_debug.h"
+#include "kal_wp_hook.h"
+#include "mddbg_public.h"
+
+#define __MER_KERNEL_UTILITY_POWER_MANAGEMENT_DEBUG__
+
+#if defined(__MER_KERNEL_UTILITY_POWER_MANAGEMENT_DEBUG__)
+#define MER_KERNEL_UTILITY_POWER_MANAGEMENT_DEBUG_QUEUE_SIZE 16
+
+typedef struct {
+ mer_uint32 timestamp;
+ mer_uint32 idle_core;
+ mer_uint32 affinity_mask;
+} mer_kernel_utility_power_management_info;
+
+typedef struct {
+ mer_uint32 index;
+ mer_kernel_utility_power_management_info queue[MER_KERNEL_UTILITY_POWER_MANAGEMENT_DEBUG_QUEUE_SIZE];
+} mer_kernel_utility_power_management_event;
+
+extern mer_kernel_utility_power_management_event mer_kernel_utility_power_management_queue;
+
+#endif /* __MER_KERNEL_UTILITY_POWER_MANAGEMENT_DEBUG__ */
+
+
+#if defined(__MD97__) || defined(__MD97P__)
+#define MER_KERNEL_UTILITY_STACK_WRITE_PROTECT(addr) KAL_STACK_PROTECT(addr)
+#endif
+
+#if (!defined(DISABLE_MDDBG_FUNCTION))
+ #define MER_KERNEL_UTILITY_SET_WATCHPOINT(vpe, cb) wp_hook_schedule(vpe, (cb)->name);
+#else
+ #define MER_KERNEL_UTILITY_SET_WATCHPOINT(vpe, cb)
+#endif
+
+extern void mer_kernel_utility_os_interrupt_mips(mer_uint32 vpe);
+extern void mer_kernel_utility_power_management_mips(mer_uint32 affinity_mask);
+#endif /* _MER_KERNEL_UTILITY_TARGET_MIPS_H_ */
+
diff --git a/mcu/service/mertos/include/mer_service_bits_op.h b/mcu/service/mertos/include/mer_service_bits_op.h
new file mode 100644
index 0000000..de2798a
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_bits_op.h
@@ -0,0 +1,97 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_service_bits_op.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare bit operation functions.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+
+#ifndef _MER_SERVICE_BITS_OP_H_
+#define _MER_SERVICE_BITS_OP_H_
+
+#include "mer_service_types.h"
+
+static inline mer_int32 mer_service_get_first_bit1(mer_uint32 Val)
+{
+ return 31 - __builtin_clz(Val);
+}
+
+static inline mer_int32 mer_service_get_first_bit0(mer_uint32 Val)
+{
+ return 31 - __builtin_clz(~Val);
+}
+
+static inline mer_int32 mer_service_get_tail_bit1(mer_uint32 Val)
+{
+ return __builtin_ctz(Val);
+}
+
+static inline mer_int32 mer_service_get_tail_bit0(mer_uint32 Val)
+{
+ return __builtin_ctz(~Val);
+}
+
+static inline void mer_service_set_one_at_pos(mer_uint32 *pVal, mer_int32 pos)
+{
+ *pVal = (*pVal) | (1 << pos);
+}
+
+static inline void mer_service_set_zero_at_pos(mer_uint32 *pVal, mer_int32 pos)
+{
+ *pVal = (*pVal) & (~(1 << pos));
+}
+
+static inline mer_int32 mer_service_count_bit1s(mer_uint32 Val)
+{
+ return -1;
+}
+
+#endif /* _MER_SERVICE_BITS_OP_H_ */
diff --git a/mcu/service/mertos/include/mer_service_event_group.h b/mcu/service/mertos/include/mer_service_event_group.h
new file mode 100644
index 0000000..8890ef9
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_event_group.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) 2018
+*
+* 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:
+* ---------
+* mer_service_event_group.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare data structures and functions for event group.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+#ifndef _MER_SERVICE_EVENT_GROUP_H_
+#define _MER_SERVICE_EVENT_GROUP_H_
+
+#include "mer_service_task.h"
+#include "mer_service_types.h"
+
+#define MER_SERVICE_EVENT_GROUP_NAME_LEN 8
+#define MER_SERVICE_EVENT_GROUP_GET (egname) mer_service_event_group_##egname
+#define MER_SERVICE_EVENT_GROUP_GET_ID(egname) &mer_service_event_group_##egname
+#define MER_SERVICE_EVENT_GROUP_NO_WAIT 0x0UL
+#define MER_SERVICE_EVENT_GROUP_INFINITE_WAIT 0xFFFFFFFFUL
+
+///////////////////////////////////////////////////////////////////////////////
+// enum
+///////////////////////////////////////////////////////////////////////////////
+typedef enum _mer_service_event_group_operation
+{
+ MER_EVENT_GROUP_NONE = 0,
+ MER_EVENT_GROUP_OR,
+ MER_EVENT_GROUP_AND,
+ MER_EVENT_GROUP_CONSUME = 0x10
+} mer_service_event_group_operation;
+
+///////////////////////////////////////////////////////////////////////////////
+// Structure
+///////////////////////////////////////////////////////////////////////////////
+typedef struct _mer_service_eg_suspend_node
+{
+ mer_service_task_id taskid;
+ mer_uint32 event_bits;
+ mer_service_event_group_operation op;
+ mer_bool wake_up_by_event;
+} mer_service_eg_suspend_node;
+typedef mer_service_eg_suspend_node *mer_service_eg_suspend_node_id, *mer_service_eg_suspend_node_ptr;
+
+typedef struct _mer_service_event_group
+{
+ mer_uint32 events;
+ mer_int8 name[MER_SERVICE_EVENT_GROUP_NAME_LEN];
+ mer_service_dlist suspend_taskids;
+} mer_service_event_group;
+typedef mer_service_event_group *mer_service_event_group_id;
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Events(parameter) will do or operation with events in event group,
+ * and resume tasks if there are
+ * susend tasks that match the events. Return 0 if function run successfully,
+ * and return -1 for abnormal.
+ *
+ * @param[in] Event group id (pointer).
+ * @param[in] Events that want to set.
+ *
+ */
+MER_STATUS mer_service_event_group_set_or(mer_service_event_group_id egid, mer_uint32 events);
+MER_STATUS mer_service_event_group_set_or_in_mt(mer_service_event_group_id egid, mer_uint32 events);
+/**
+ * Events(parameter) will do and operation with events in event group.
+ * This won't resume any task.
+ *
+ * @param[in] Event group id (pointer).
+ * @param[in] Events that want to do and with event group.
+ *
+ */
+void mer_service_event_group_set_and(mer_service_event_group_id egid, mer_uint32 events);
+void mer_service_event_group_set_and_in_mt(mer_service_event_group_id egid, mer_uint32 events);
+/**
+ * Events(parameter) will inverse first
+ * and do and operation with events in event group.
+ * This won't resume any task.
+ *
+ * @param[in] Event group id (pointer).
+ * @param[in] Events that want to clear.
+ *
+ */
+void mer_service_event_group_clear(mer_service_event_group_id egid, mer_uint32 events);
+
+/**
+ * Retrieve some events, and if not match the current events, task will suspend.
+ *
+ * @param[in] Event group id (pointer).
+ * @param[in] Events that want to retrieve.
+ * @param[in] Wait all events or one of the events to retrieve.
+ * @param[in] Timer for time out.
+ * @param[out] Retrieved events.
+ *
+ */
+MER_STATUS mer_service_event_group_retrieve(
+ mer_service_event_group_id egid,
+ mer_uint32 events,
+ mer_service_event_group_operation op,
+ mer_uint32 timer,
+ mer_uint32 *retrieved_events
+);
+
+/**
+ * Get event value in event group.
+ *
+ * @param[in] Event group id (pointer).
+ *
+ */
+static inline mer_uint32 mer_service_event_group_get_events(mer_service_event_group_id eg)
+{
+ return eg->events;
+}
+
+#endif /* _MER_SERVICE_EVENT_GROUP_H_ */
+
diff --git a/mcu/service/mertos/include/mer_service_fixmem.h b/mcu/service/mertos/include/mer_service_fixmem.h
new file mode 100644
index 0000000..915ebee
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_fixmem.h
@@ -0,0 +1,119 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_service_fixmem.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare data structures and functions for fixed block size memory.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+#ifndef _MER_SERVICE_FIXMEM_H_
+#define _MER_SERVICE_FIXMEM_H_
+
+#include "mer_service_types.h"
+
+#define mer_service_fixmem_GET(type, fixmemsize) g_fixmem_pool_##type##_##fixmemsize
+
+// Control block of a fixmem pool
+// Now, it can manage 1024 blocks at most.
+typedef struct
+{
+ mer_bool pool_is_allocated;
+ mer_mem_ptr pmem;
+ mer_uint32 blksize;
+ mer_uint32 blknum;
+ mer_uint8 max_group;
+ mer_uint32 group_mgr;
+ mer_uint32 groups[32];
+} mer_service_fixmem_pool_cb;
+typedef mer_service_fixmem_pool_cb mer_service_fixmem_pool, *mer_service_fixmem_pool_id;
+
+// Allocate a memory block of blksize
+MER_STATUS mer_service_fixmem_alloc_blk
+(
+ mer_service_fixmem_pool_id pmid,
+ mer_mem_ptr *pptr
+);
+
+// Allocate a memory block of blksize with multi-threading active
+MER_STATUS mer_service_fixmem_alloc_blk_in_mt
+(
+ mer_service_fixmem_pool_id pmid,
+ mer_mem_ptr *pptr
+);
+
+// Allocate a memory block of blksize with interrupt disabled
+MER_STATUS mer_service_fixmem_alloc_blk_with_di
+(
+ mer_service_fixmem_pool_id pmid,
+ mer_mem_ptr *pptr
+);
+
+// Free a memory block of blksize
+MER_STATUS mer_service_fixmem_free_blk
+(
+ mer_service_fixmem_pool_id fixmemid,
+ mer_mem_ptr ptr
+);
+
+// Free a memory block of blksize with multi-threading active
+MER_STATUS mer_service_fixmem_free_blk_in_mt
+(
+ mer_service_fixmem_pool_id fixmemid,
+ mer_mem_ptr ptr
+);
+
+// Free a memory block of blksize with interrupt disabled
+MER_STATUS mer_service_fixmem_free_blk_with_di
+(
+ mer_service_fixmem_pool_id fixmemid,
+ mer_mem_ptr ptr
+);
+
+#endif /* _MER_SERVICE_FIXMEM_H_ */
diff --git a/mcu/service/mertos/include/mer_service_list.h b/mcu/service/mertos/include/mer_service_list.h
new file mode 100644
index 0000000..61750c6
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_list.h
@@ -0,0 +1,176 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_service_list.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare data structures and functions for lists.
+* There are 3 kind of lists:
+* double ended linked list,
+* doubly linked list,
+* cyclic doubly linked list.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+#ifndef _MER_SERVICE_LIST_H_
+#define _MER_SERVICE_LIST_H_
+
+#include "mer_service_types.h"
+
+typedef void(*mer_service_showfunc)(mer_mem_ptr);
+typedef mer_bool (*mer_service_compfunc_unary)(mer_mem_ptr);
+typedef mer_bool (*mer_service_compfunc_binary)(mer_mem_ptr, mer_mem_ptr);
+typedef mer_int32(*mer_service_compfunc_binary_3state)(mer_mem_ptr, mer_mem_ptr);
+
+// List Node
+typedef struct _mer_service_list_node
+{
+ mer_mem_ptr pdata;
+ struct _mer_service_list_node *pnext;
+} mer_service_list_node;
+typedef mer_service_list_node *mer_service_list_node_ptr;
+
+// List
+typedef struct _mer_service_list
+{
+ mer_uint32 nodenum;
+ mer_service_list_node_ptr phead, ptail;
+} mer_service_list;
+typedef mer_service_list *mer_service_list_id;
+
+// List node operations
+void mer_service_list_node_make_node(mer_service_list_node_ptr plist, mer_mem_ptr pdata);
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+// List operations
+void mer_service_list_create(mer_service_list_id listid, mer_service_list_node_ptr pheadnode);
+void mer_service_list_ins_before_head(mer_service_list_id listid, mer_service_list_node_ptr pnode);
+void mer_service_list_ins_after_tail(mer_service_list_id listid, mer_service_list_node_ptr pnode);
+void mer_service_list_ins_after(mer_service_list_id listid, mer_service_list_node_ptr pnode, mer_service_list_node_ptr pnodeins);
+void mer_service_list_ins_after_if_append_ifnot_2(mer_service_list_id listid, mer_service_list_node_ptr pnodeins, mer_service_compfunc_binary compfunc);
+void mer_service_list_ins_before_if_append_ifnot_2(mer_service_list_id listid, mer_service_list_node_ptr pnodeins, mer_service_compfunc_binary compfunc);
+
+mer_service_list_node_ptr mer_service_list_del_head(mer_service_list_id listid);
+mer_service_list_node_ptr mer_service_list_del_tail(mer_service_list_id listid);
+mer_service_list_node_ptr mer_service_list_del_next(mer_service_list_id listid, mer_service_list_node_ptr pdelprev);
+mer_service_list_node_ptr mer_service_list_find_prev_node(mer_service_list_id listid, mer_service_list_node_ptr pnode);
+mer_service_list_node_ptr mer_service_list_find_if_1(mer_service_list_id listid, mer_service_compfunc_unary compfunc);
+mer_service_list_node_ptr mer_service_list_find_if_2(mer_service_list_id listid, mer_mem_ptr pcompval, mer_service_compfunc_binary compfunc);
+
+// List show functions
+void mer_service_list_node_show_one(mer_service_list_node_ptr pnode, mer_service_showfunc showdata);
+void mer_service_list_node_show_all(mer_service_list_node_ptr plist);
+
+void mer_service_list_show(mer_service_list_id listid, mer_service_showfunc showdata);
+
+// DList Node
+typedef struct _mer_service_dlist_node
+{
+ mer_mem_ptr pdata;
+ struct _mer_service_dlist_node *pnext;
+ struct _mer_service_dlist_node *pprev;
+} mer_service_dlist_node;
+typedef mer_service_dlist_node *mer_service_dlist_node_ptr;
+
+#define MER_SERVICE_DLIST_NODE_SIZE sizeof(mer_service_dlist_node)
+
+typedef struct _mer_service_dlist
+{
+ mer_uint32 nodenum;
+ mer_service_dlist_node_ptr phead;
+} mer_service_dlist;
+typedef mer_service_dlist mer_service_dlist, *mer_service_dlist_id;
+
+void mer_service_dlist_node_make_node(mer_service_dlist_node_ptr plist, mer_mem_ptr pdata);
+void mer_service_dlist_node_cyc_make_node(mer_service_dlist_node_ptr plist, mer_mem_ptr pdata);
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+// Cyclic DList operations
+void mer_service_dlist_cyc_create(mer_service_dlist_id dlistid, mer_service_dlist_node_ptr pheadnode);
+
+void mer_service_dlist_cyc_ins_before_head(mer_service_dlist_id dlistid, mer_service_dlist_node_ptr pnode);
+void mer_service_dlist_cyc_ins_last(mer_service_dlist_id dlistid, mer_service_dlist_node_ptr pnode);
+void mer_service_dlist_cyc_ins_after(mer_service_dlist_id dlistid, mer_service_dlist_node_ptr pnode, mer_service_dlist_node_ptr pnodeins);
+void mer_service_dlist_cyc_ins_before(mer_service_dlist_id dlistid, mer_service_dlist_node_ptr pnode, mer_service_dlist_node_ptr pnodeins);
+mer_service_dlist_node_ptr mer_service_dlist_cyc_ins_before_if_append_ifnot_2(mer_service_dlist_id dlistid, mer_service_dlist_node_ptr pnode, mer_service_compfunc_binary compfunc);
+mer_service_dlist_node_ptr mer_service_dlist_cyc_ins_before_ifgt0_no_ins_iflt0_append_else_2(mer_service_dlist_id dlistid, mer_service_dlist_node_ptr pnode, mer_service_compfunc_binary_3state compfunc);
+
+mer_service_dlist_node_ptr mer_service_dlist_cyc_del_head(mer_service_dlist_id dlistid);
+mer_service_dlist_node_ptr mer_service_dlist_cyc_del(mer_service_dlist_id dlistid, mer_service_dlist_node_ptr pnodedel);
+
+mer_service_dlist_node_ptr mer_service_dlist_cyc_find_if_1(mer_service_dlist_id dlistid, mer_service_compfunc_unary compfunc);
+mer_service_dlist_node_ptr mer_service_dlist_cyc_find_if_2(mer_service_dlist_id dlistid, mer_mem_ptr pcompval, mer_service_compfunc_binary compfunc);
+
+// DList show functions
+void mer_service_dlist_node_show_one(mer_service_dlist_node_ptr pnode, mer_service_showfunc showdata);
+void mer_service_dlist_node_show_all(mer_service_dlist_node_ptr plist);
+
+void mer_service_dlist_cyc_show(mer_service_dlist_id listid, mer_service_showfunc showdata);
+void mer_service_dlist_cyc_show_simple(mer_service_dlist_id listid, mer_service_showfunc showdata);
+
+#endif /* _MER_SERVICE_LIST_H_ */
+
diff --git a/mcu/service/mertos/include/mer_service_mail_queue.h b/mcu/service/mertos/include/mer_service_mail_queue.h
new file mode 100644
index 0000000..27e503f
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_mail_queue.h
@@ -0,0 +1,243 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_service_mail_queue.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare data structures and functions for mail queues.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+#ifndef _MER_SERVICE_MAIL_QUEUE_H_
+#define _MER_SERVICE_MAIL_QUEUE_H_
+
+#include "mer_service_list.h"
+#include "mer_service_task.h"
+#include "mer_service_types.h"
+#include "mer_kernel_task.h"
+
+extern mer_kernel_task_cb mer_kernel_task_info_table[];
+///////////////////////////////////////////////////////////////////////////////
+// enum
+///////////////////////////////////////////////////////////////////////////////
+typedef enum {
+ MER_SERVICE_MQ_BLOCK_ON_EMPTY = 0,
+ MER_SERVICE_MQ_RETURN_ON_EMPTY = 1
+} mer_service_mail_queue_block_on_empty;
+
+///////////////////////////////////////////////////////////////////////////////
+// Structure
+///////////////////////////////////////////////////////////////////////////////
+typedef struct _mer_service_mail_queue
+{
+ mer_service_task_id ownerid; // owner task id (pointer to the cb)
+ mer_mem_ptr pmail; // pointer to the mail array
+ mer_uint32 mailsize; // per mail size
+ mer_uint32 mailnum; // max num for this mail queue
+ mer_uint32 mailhead; // index to the first readable element
+ mer_uint32 mailtail; // index to the first writeable element
+ mer_uint32 mailcount; // current mail number in mail queue
+ mer_uint32 maxusedcount; // max used mail num in history
+} mer_service_mail_queue;
+typedef mer_service_mail_queue mer_service_mq, *mer_service_mq_id;
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Write the Mail Queue from head.
+ * The task will return -1 if the mail queue is full.
+ *
+ * @param[out] Status. Success = 0, Fail = -1.
+ * @param[in] Mail queue id (pointer).
+ * @param[in] pointer of the sent mail.
+ *
+ */
+MER_STATUS mer_service_mq_write_head
+(
+ mer_service_mq_id mqid,
+ mer_mem_ptr mqpmem
+);
+MER_STATUS mer_service_mq_write_head_in_mt
+(
+ mer_service_mq_id mqid,
+ mer_mem_ptr mqpmem
+);
+
+/**
+ * Write the Mail Queue from tail.
+ * The task will return -1 if the mail queue is full.
+ *
+ * @param[out] Status. Success = 0, Fail = -1.
+ * @param[in] Mail queue id (pointer).
+ * @param[in] pointer of the sent mail.
+ *
+ */
+MER_STATUS mer_service_mq_write_tail
+(
+ mer_service_mq_id mqid,
+ mer_mem_ptr mqpmem
+);
+MER_STATUS mer_service_mq_write_tail_in_mt
+(
+ mer_service_mq_id mqid,
+ mer_mem_ptr mqpmem
+);
+
+/**
+ * Read the Mail Queue from head.
+ * If block_on_empty is equal MER_SERVICE_MQ_BLOCK_ON_EMPTY,
+ * the task will suspend when nothing in mail queue.
+ * Otherwise, it return -1 when nothing in mail queue.
+ *
+ * @param[out] Status. Success = 0, Fail = -1.
+ * @param[in] Mail queue id (pointer).
+ * @param[in] pointer of the received mail.
+ * @param[in] option that if suspended when queue mail is empty
+ *
+ */
+MER_STATUS mer_service_mq_read
+(
+ mer_service_mq_id mqid,
+ mer_mem_ptr mqpmem,
+ mer_service_mail_queue_block_on_empty block_on_empty
+);
+
+/**
+ * Peek the Mail Queue from head and won't change
+ * number of received mail.
+ * If define MER_SERVICE_CFG_MQ_READ_BLOCK_ON_FAIL,
+ * the task will suspend when nothing in mail queue.
+ * Otherwise, it return -1 when nothing in mail queue.
+ *
+ * @param[out] Status. Success = 0, Fail = -1.
+ * @param[in] Mail queue id (pointer).
+ * @param[in] pointer of the received mail.
+ *
+ */
+MER_STATUS mer_service_mq_peek
+(
+ mer_service_mq_id mqid,
+ mer_mem_ptr *mqppmem
+);
+
+/**
+ * Pop the Mail Queue from head and won't get the mail data.
+ * If no mail, return -1
+ *
+ * @param[out] Status. Success = 0, Fail = -1.
+ * @param[in] Mail queue id (pointer).
+ */
+MER_STATUS mer_service_mq_pop
+(
+ mer_service_mq_id mqid
+);
+
+/**
+ * Return the mail queue pointer with task index
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] Mail queue pointer of the task
+ * @param[in] Index of task
+ *
+ */
+static inline mer_service_mq_id mer_service_get_mq_by_task(mer_uint32 task_index)
+{
+ return (mer_kernel_task_info_table[task_index].mq);
+}
+
+/**
+ * Return the mail number in mail queue.
+ *
+ * Time complexity O(1)
+ *
+ * @param[in] Mail queue id (pointer).
+ *
+ */
+static inline mer_uint32 mer_service_get_mq_mailcount(mer_service_mq_id mqid)
+{
+ return (mqid->mailcount);
+}
+
+/**
+ * Return the mail number in mail queue.
+ *
+ * Time complexity O(1)
+ *
+ * @param[in] Mail queue id (pointer).
+ *
+ */
+static inline mer_uint32 mer_service_get_mq_maxcount(mer_service_mq_id mqid)
+{
+ return (mqid->mailnum);
+}
+
+/**
+ * Return the mail queue array pointer.
+ *
+ * Time complexity O(1)
+ *
+ * @param[in] Mail queue id (pointer).
+ *
+ */
+static inline mer_mem_ptr mer_service_get_mq_pmail(mer_service_mq_id mqid)
+{
+ return (mqid->pmail);
+}
+
+/**
+ * Show mail queue cb info.
+ *
+ * Time complexity O(1)
+ *
+ * @param[out] Mail queue pointer of the task
+ * @param[in] Index of task
+ *
+ */
+void mer_service_mq_show(mer_service_mq_id mqid);
+
+#endif /* _MER_SERVICE_MAIL_QUEUE_H_ */
diff --git a/mcu/service/mertos/include/mer_service_print_esl.h b/mcu/service/mertos/include/mer_service_print_esl.h
new file mode 100644
index 0000000..a1b76c9
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_print_esl.h
@@ -0,0 +1,75 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_service_print_esl.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Define service print in esl
+*
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+#ifndef _MER_SERVICE_PRINT_ESL_H
+#define _MER_SERVICE_PRINT_ESL_H
+
+#include "kal_public_api.h"
+//#include "esl_debug.h"
+#include "mer_kernel_lock_target_mips.h"
+
+extern mer_kernel_lock_id mer_service_print_lock;
+#undef mer_dbg_print
+#define mer_dbg_print(...) \
+ do { \
+ mer_kernel_lock_take(&mer_service_print_lock); \
+ esl_printf(0, __VA_ARGS__); \
+ mer_kernel_lock_release_with_ei(&mer_service_print_lock); \
+ }while(0)
+
+#undef mer_dbg_print
+#define mer_dbg_print(...)
+
+#endif /*_MER_SERVICE_PRINT_ESL_H*/
diff --git a/mcu/service/mertos/include/mer_service_priority_mask.h b/mcu/service/mertos/include/mer_service_priority_mask.h
new file mode 100644
index 0000000..25ac954
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_priority_mask.h
@@ -0,0 +1,158 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_service_priority_mask.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare priority bit mask.
+* This is a bit mask to present priorities of all tasks.
+* There is no two tasks having same priority.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+#ifndef _MER_SERVICE_PRIORITY_MASK_H_
+#define _MER_SERVICE_PRIORITY_MASK_H_
+
+#include "mer_service_bits_op.h"
+#include "mer_service_types.h"
+#include "mer_kernel_task.h"
+
+#define MER_SERVICE_CFG_TASK_MAX_NUMBER 256
+#define MER_SERVICE_CFG_TASK_PRIORITY_SLOT_NUM (MER_KERNEL_TASK_NUM / 32 + ((MER_KERNEL_TASK_NUM % 32 == 0) ? 0 : 1))
+
+typedef struct _mer_service_priority_mask
+{
+ mer_uint32 priority[MER_SERVICE_CFG_TASK_MAX_NUMBER / 32];
+} mer_service_priority_mask, *mer_service_priority_mask_id;
+
+static inline void mer_service_pm_reset(mer_service_priority_mask_id pmid)
+{
+ mer_uint32 i;
+
+ for (i = 0; i < MER_SERVICE_CFG_TASK_PRIORITY_SLOT_NUM; ++i)
+ pmid->priority[i] = 0;
+}
+
+static inline void mer_service_pm_add(mer_service_priority_mask_id pmid, mer_uint32 prio)
+{
+ pmid->priority[prio >> 5] |= 1 << (prio & 0x1f);
+}
+
+static inline void mer_service_pm_del(mer_service_priority_mask_id pmid, mer_uint32 prio)
+{
+ pmid->priority[prio >> 5] &= ~(1 << (prio & 0x1f));
+}
+
+static inline void mer_service_pm_and(mer_service_priority_mask_id srcid, mer_service_priority_mask_id dstid)
+{
+ mer_uint32 i;
+
+ for (i = 0; i < MER_SERVICE_CFG_TASK_PRIORITY_SLOT_NUM; ++i)
+ srcid->priority[i] &= dstid->priority[i];
+}
+
+static inline void mer_service_pm_or(mer_service_priority_mask_id srcid, mer_service_priority_mask_id dstid)
+{
+ mer_uint32 i;
+
+ for (i = 0; i < MER_SERVICE_CFG_TASK_PRIORITY_SLOT_NUM; ++i)
+ srcid->priority[i] |= dstid->priority[i];
+}
+
+static inline void mer_service_pm_xor(mer_service_priority_mask_id srcid, mer_service_priority_mask_id dstid)
+{
+ mer_uint32 i;
+
+ for (i = 0; i < MER_SERVICE_CFG_TASK_PRIORITY_SLOT_NUM; ++i)
+ srcid->priority[i] ^= dstid->priority[i];
+}
+
+static inline void mer_service_pm_not_imp(mer_service_priority_mask_id srcid, mer_service_priority_mask_id dstid)
+{
+ mer_uint32 i;
+
+ for (i = 0; i < MER_SERVICE_CFG_TASK_PRIORITY_SLOT_NUM; ++i)
+ srcid->priority[i] &= ~dstid->priority[i];
+}
+
+static inline mer_uint32 mer_service_pm_get_first(mer_service_priority_mask_id pmid)
+{
+ mer_uint32 prio = 0xffffffff;
+ mer_uint32 i;
+
+ for (i = 0; i < MER_SERVICE_CFG_TASK_PRIORITY_SLOT_NUM; ++i)
+ {
+ if (pmid->priority[i] != 0)
+ {
+ prio = 32 * i + mer_service_get_tail_bit1(pmid->priority[i]);
+ break;
+ }
+ }
+
+ return prio;
+}
+
+static inline mer_uint32 mer_service_pm_get_first_and_del(mer_service_priority_mask_id pmid)
+{
+ mer_uint32 prio = 0xffffffff;
+ mer_uint32 i;
+
+ for (i = 0; i < MER_SERVICE_CFG_TASK_PRIORITY_SLOT_NUM; ++i)
+ {
+ if (pmid->priority[i] != 0)
+ {
+ prio = 32 * i + mer_service_get_tail_bit1(pmid->priority[i]);
+ pmid->priority[i] &= ~(1 << (prio & 0x1f));
+ break;
+ }
+ }
+
+ return prio;
+}
+
+#endif /* _MER_SERVICE_PRIORITY_MASK_H_ */
diff --git a/mcu/service/mertos/include/mer_service_ret_codes.h b/mcu/service/mertos/include/mer_service_ret_codes.h
new file mode 100644
index 0000000..1c5fb18
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_ret_codes.h
@@ -0,0 +1,90 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_service_ret_codes.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare service return codes
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+#ifndef _MER_SERVICE_RET_CODES_H_
+#define _MER_SERVICE_RET_CODES_H_
+
+typedef enum {
+
+ MER_SERVICE_SUCCESS = 0,
+
+ /* Fixed Memory */
+ MER_SERVICE_FIXMEM_POOL_DOUBLE_ALLOCATED = -1,
+ MER_SERVICE_FIXMEM_BLK_MORE_THAN_1024 = -2,
+ MER_SERVICE_FIXMEM_POOL_NOT_ALLOCATED = -3,
+ MER_SERVICE_FIXMEM_POOL_MEM_IS_NULL = -4,
+ MER_SERVICE_FIXMEM_OUT_OF_BLK = -5,
+
+ /* Mail Queue */
+ MER_SERVICE_MQ_MQID_IS_NULL = -6,
+ MER_SERVICE_MQ_IS_FULL = -7,
+ MER_SERVICE_MQ_IS_EMPTY = -8,
+
+ /* Semaphore */
+ MER_SERVICE_SEMAPHORE_IS_EMPTY = -9,
+
+ /* Event Group */
+ MER_SERVICE_EVENT_GROUP_UNKNOWN_OP = -10,
+ MER_SERVICE_EVENT_GROUP_NO_MATCH_EVENTS = -11,
+
+ /* Enhanced Mutex */
+ MER_SERVICE_ENHMUTEX_DOUBLE_FREE = -12,
+
+ /* Task */
+ MER_KERNEL_TASK_INVALID_SUSPEND = -13
+
+} mer_service_return_code;
+
+#endif /* _MER_SERVICE_RET_CODES_H_ */
diff --git a/mcu/service/mertos/include/mer_service_semaphore.h b/mcu/service/mertos/include/mer_service_semaphore.h
new file mode 100644
index 0000000..2d0ed27
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_semaphore.h
@@ -0,0 +1,121 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_service_semaphore.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare data structures and functions for semaphore.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+#ifndef _MER_SERVICE_SEMAPHORE_H_
+#define _MER_SERVICE_SEMAPHORE_H_
+
+#include "mer_service_types.h"
+#include "mer_service_list.h"
+
+#define MER_SERVICE_SEMAPHORE_NAME_LEN 8
+
+///////////////////////////////////////////////////////////////////////////////
+// enum
+///////////////////////////////////////////////////////////////////////////////
+typedef enum {
+ MER_SERVICE_SEM_BLOCK_ON_EMPTY = 0,
+ MER_SERVICE_SEM_RETURN_ON_EMPTY = 1
+} mer_service_semaphore_block_on_empty;
+
+///////////////////////////////////////////////////////////////////////////////
+// Structure
+///////////////////////////////////////////////////////////////////////////////
+typedef struct _mer_service_semaphore
+{
+ mer_int8 name[MER_SERVICE_SEMAPHORE_NAME_LEN];
+ mer_uint32 sem_value;
+ mer_uint32 waitingcount;
+ mer_service_dlist suspend_taskids;
+} mer_service_semaphore;
+typedef mer_service_semaphore *mer_service_semaphore_id;
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+* Take semaphore. If the sem_value is equal to zero, the task will be suspended (option)
+* If it runs successfully will return 0, returning -1 for abnormal.
+*
+* @param[in] Semaphore id (pointer)
+* @param[in] option that if suspended when out of semaphore.
+*
+*/
+MER_STATUS mer_service_semaphore_take
+(
+ mer_service_semaphore_id sem_id,
+ mer_service_semaphore_block_on_empty block_on_empty
+);
+
+/**
+* Give semaphore. If there is suspended task waited for this semaphore,
+* it will resume the task (first in first resume).
+* If it runs successfully will return 0, returning -1 for abnormal.
+*
+* @param[in] Semaphore id (pointer)
+*
+*/
+MER_STATUS mer_service_semaphore_give(mer_service_semaphore_id sem_id);
+MER_STATUS mer_service_semaphore_give_in_mt(mer_service_semaphore_id sem_id);
+
+/**
+* Get number of the waiting task for the semaphore.
+*
+* @param[in] Semaphore id (pointer)
+*
+*/
+static inline mer_uint32 mer_service_get_semaphore_waitingcount(mer_service_semaphore_id sem_id)
+{
+ return (sem_id->waitingcount);
+}
+
+#endif /* _MER_SERVICE_SEMAPHORE_H_ */
diff --git a/mcu/service/mertos/include/mer_service_sync_enhmutex.h b/mcu/service/mertos/include/mer_service_sync_enhmutex.h
new file mode 100644
index 0000000..64176da
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_sync_enhmutex.h
@@ -0,0 +1,89 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_service_sync_enhamutex.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare synchrous object's functions -- enhanced mutex.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+#ifndef _MER_SERVICE_SYN_ENHMUTEX_H_
+#define _MER_SERVICE_SYN_ENHMUTEX_H_
+
+#include "mer_service_list.h"
+#include "mer_service_priority_mask.h"
+#include "mer_service_task.h"
+#include "mer_service_types.h"
+
+#define MER_SERVICE_SYNC_ENHMUTEX_GET(enhmutexname) g_sync_enhmutex_##enhmutexname
+#define MER_SERVICE_SYNC_ENHMUTEX_GET_ID(enhmutexname) &g_sync_enhmutex_##enhmutexname
+
+#define MER_SERVICE_SYNC_ENHMUTEX_NAME_LEN 8
+
+typedef enum _ENHMUTEX_STATE
+{
+ MER_SERVIVE_ENHMUTEX_FREE,
+ MER_SERVIVE_ENHMUTEX_TAKEN,
+} MER_SERVICE_SYNC_ENHMUTEX_STATE;
+
+typedef struct _mer_service_sync_enhanced_mutex
+{
+ mer_int8 name[MER_SERVICE_SYNC_ENHMUTEX_NAME_LEN];
+ mer_service_dlist suspend_taskids;
+ mer_service_priority_mask priorities; // waiting tasks' priorities
+ mer_service_task_id ownerid;
+ mer_service_dlist_node task_owned_enhmutex_node;
+ MER_SERVICE_SYNC_ENHMUTEX_STATE state;
+} mer_service_sync_enhanced_mutex;
+typedef mer_service_sync_enhanced_mutex *mer_service_sync_enhanced_mutex_id;
+
+MER_STATUS mer_service_sync_enhmutex_take(mer_service_sync_enhanced_mutex_id enhmutexid);
+MER_STATUS mer_service_sync_enhmutex_give(mer_service_sync_enhanced_mutex_id enhmutexid);
+
+#endif /* _MER_SERVICE_SYN_ENHMUTEX_H_ */
diff --git a/mcu/service/mertos/include/mer_service_task.h b/mcu/service/mertos/include/mer_service_task.h
new file mode 100644
index 0000000..7673d9d
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_task.h
@@ -0,0 +1,165 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_service_task.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare data structures and functions for tasks.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+#ifndef _MER_SERVICE_TASK_H_
+#define _MER_SERVICE_TASK_H_
+
+#include "mer_service_list.h"
+#include "mer_service_types.h"
+#include "mer_kernel_config_public.h"
+
+
+#define MER_SERVICE_TASK_GET_TASKID_BYINDEX(tindex) &mer_kernel_task_info_table[tindex]
+#define MER_SERVICE_TASK_GET_TASKID_BYNAME(tname) MER_SERVICE_TASK_GET_TASKID_BYINDEX(TINDEX_##tname)
+
+#define MER_SERVICE_TASK_NAME_LEN 60
+
+typedef enum
+{
+ MER_SERVICE_TYPE_TASK = 0,
+ MER_SERVICE_TYPE_DPC = 1,
+ MER_SERVICE_TYPE_NONE,
+} mer_service_job_type;
+
+typedef enum
+{
+ MER_SERVICE_WAIT = 1,
+ MER_SERVICE_RUN = 2,
+ MER_SERVICE_NO_ACTIVATE = 3,
+ MER_SERVICE_SUSPEND_BEGIN = 4,
+ MER_SERVICE_QUEUE_SUSPEND = 5,
+ MER_SERVICE_EVENT_SUSPEND = 6,
+ MER_SERVICE_SLEEP_SUSPEND = 7,
+ MER_SERVICE_SEMA_SUSPEND = 8,
+ MER_SERVICE_ENHMUTEX_SUSPEND = 9,
+ MER_SERVICE_SUSPEND_END = 10,
+} mer_service_task_state;
+
+typedef void(*mer_service_task_main_func)(void);
+typedef void(*mer_service_task_init_func)(void);
+
+struct _mer_service_mail_queue;
+typedef struct _mer_service_mail_queue *mer_service_mq_id;
+
+struct _mer_service_sync_enhanced_mutex;
+typedef struct _mer_service_sync_enhanced_mutex *mer_service_sync_enhanced_mutex_id;
+
+typedef struct
+{
+ mer_mem_ptr stack_ptr;
+ mer_uint32 affinity_mask;
+ mer_char name[MER_SERVICE_TASK_NAME_LEN];
+ mer_service_task_state state;
+ mer_uint8 job_index;
+ mer_service_job_type job_type;
+ mer_uint32 context;
+ mer_mem_ptr stack_end;
+ mer_service_task_main_func func_main;
+ mer_uint32 last_execution_vpe;
+ mer_uint32 stack_size;
+ mer_service_mq_id mq;
+ mer_service_sync_enhanced_mutex_id wait_enhmutex;
+ mer_service_dlist owned_enhmutex_dlist;
+ mer_uint8 inheritor_task_index;
+ mer_uint8 priority;
+ mer_service_task_init_func func_init;
+ mer_mem_ptr reset_stack_ptr;
+ mer_uint32 initial_affinity_mask;
+ mer_uint32 suspend_max_delay;
+} mer_service_task_cb;
+typedef mer_service_task_cb *mer_service_task_id;
+
+extern mer_service_task_cb mer_kernel_task_info_table[];
+
+void mer_service_task_init();
+
+MER_STATUS mer_service_task_create
+(
+ mer_service_task_state state,
+ mer_uint32 priority,
+ mer_uint32 stack_size,
+ mer_mem_ptr stack_ptr
+);
+
+void mer_service_task_show(mer_service_task_id taskid);
+
+
+// DPC
+typedef void(*mer_service_dpc_func)(void);
+
+typedef struct
+{
+ mer_mem_ptr stack_ptr;
+ mer_uint32 affinity_mask;
+ mer_char name[MER_SERVICE_TASK_NAME_LEN];
+ mer_service_task_state state;
+ mer_uint8 job_index;
+ mer_service_job_type job_type;
+ mer_uint32 context;
+ mer_mem_ptr stack_end;
+ mer_service_dpc_func func_handle;
+ mer_uint32 last_execution_vpe;
+ mer_uint32 priority;
+ mer_uint32 invoke_count;
+ mer_uint32 stack_size;
+ mer_uint8 next_dpc[MIPS_HW_VPE_NUM];
+ mer_uint8 prev_dpc[MIPS_HW_VPE_NUM];
+ mer_uint32 initial_affinity_mask;
+} mer_service_dpc_cb;
+typedef mer_service_dpc_cb *mer_service_dpc_id;
+
+void mer_service_dpc_show(mer_service_dpc_id dpcid);
+
+#endif /* _MER_SERVICE_TASK_H_ */
diff --git a/mcu/service/mertos/include/mer_service_timer.h b/mcu/service/mertos/include/mer_service_timer.h
new file mode 100644
index 0000000..a92b24f
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_timer.h
@@ -0,0 +1,294 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_service_timer.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare data structures and functions for timer.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+#ifndef _MER_SERVICE_TIMER_H_
+#define _MER_SERVICE_TIMER_H_
+
+#include "mer_service_types.h"
+#include "mer_service_task.h"
+#include "mer_kernel_timer.h"
+#include "mer_kernel_lock_target_mips.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// enum
+///////////////////////////////////////////////////////////////////////////////
+typedef enum {
+ MER_SERVICE_TIMER_ENABLE = 0,
+ MER_SERVICE_TIMER_DISABLE = 1
+} mer_service_timer_state;
+
+typedef enum{
+ MER_SERVICE_TIMER_TYPE_CB = 0,
+ MER_SERVICE_TIMER_TYPE_SUSPEND = 1
+} mer_service_timer_type;
+
+#define MER_SERVICE_TIMER_MAX (0xFFFFFFFF)
+// the following pattern is just for debug, and can be stripted in the future for better performance
+#define MER_SERVICE_ALIGNED_TIMER (0xcbcb)
+#define MER_SERVICE_UNALIGNED_TIMER (0xbcbc)
+
+///////////////////////////////////////////////////////////////////////////////
+// Structure
+///////////////////////////////////////////////////////////////////////////////
+typedef struct _mer_service_timer
+{
+ mer_kernel_timer_tick_info kernel_timer_cb;
+ mer_service_timer_type type;
+ mer_service_timer_state state; // for easy debugging
+ mer_uint32 expiration;
+ mer_char name[16]; // for easy debugging
+ void (*cb)(void *);
+ void *param;
+ mer_uint32 reschedule;
+ mer_uint32 delay;
+ mer_uint32 max_delay;
+} mer_service_timer;
+typedef mer_service_timer *mer_service_timer_id;
+
+///////////////////////////////////////////////////////////////////////////////
+/**
+ * Create an call back timer
+ * -1 will be returned if creation fails
+ *
+ * @param[out] MER_STATUS Success = 0, Fail = -1.
+ * @param[in] tid suspend timer control block address
+ * @param[in] name call back timer name, for debugging
+ *
+ */
+MER_STATUS mer_service_timer_create(
+ mer_service_timer_id tid,
+ const mer_char *name
+);
+
+/**
+ * start an call back timer with given parameters
+ * -1 will be returned if creation fails
+ *
+ * @param[out] MER_STATUS Success = 0, Fail = -1.
+ * @param[in] tid call back timer control block address
+ * @param[in] name call back timer name, for debugging
+ *
+ */
+MER_STATUS mer_service_timer_set(
+ mer_service_timer_id tid,
+ void (*cb)(void *),
+ void *param,
+ mer_uint32 init_delay,
+ mer_uint32 reschedule
+ );
+
+/**
+ * let suspend suspend with timeout
+ * note that if it is used for getting resource, this function may early return
+ * upper layer users must check by themself if the return is due to timeout or
+ * the resource is seccessifully gotten by the suspend
+ * -1 will be returned if creation fails
+ *
+ * @param[out] MER_STATUS Success = 0, Fail = -1.
+ * @param[in] task_id timer control block address
+ * @param[in] timeout timeout of the suspend
+ * @param[in] state reason of calling this function
+ * @param[in] lock_to_release the lock to release if any
+ *
+ */
+MER_STATUS mer_service_timer_suspend_task_with_timeout(
+ mer_service_task_id task_id,
+ mer_uint32 timeout,
+ mer_service_task_state state,
+ mer_kernel_lock_id *lock_to_release
+ );
+
+
+/**
+ * cancel a timer
+ * -1 will be returned if creation fails
+ *
+ * @param[out] MER_STATUS Success = 0, Fail = -1.
+ * @param[in] tid timer control block address
+ *
+ */
+MER_STATUS mer_service_timer_stop(mer_service_timer_id);
+
+/**
+ * set the max delay of a timer, only valid for call back timer
+ * note that this function will not start a timer
+ * -1 will be returned if creation fails
+ *
+ * @param[out] MER_STATUS Success = 0, Fail = -1.
+ * @param[in] tid timer control block address
+ *
+ */
+MER_STATUS mer_service_timer_set_max_delay(mer_service_timer_id tid, mer_uint16 delay);
+
+/**
+ * cancel the max delay of a timer
+ * note that this function will not start a timer
+ * -1 will be returned if creation fails
+ *
+ * @param[out] MER_STATUS Success = 0, Fail = -1.
+ * @param[in] tid timer control block address
+ * @param[in] dealy maximum allowable delay for this timer
+ *
+ */
+MER_STATUS mer_service_timer_cancel_max_delay(mer_service_timer_id tid);
+
+/**
+ * set the max delay for task suspend timer,
+ * note that this function will not start a timer
+ * -1 will be returned if creation fails
+ *
+ * @param[out] MER_STATUS Success = 0, Fail = -1.
+ * @param[in] tid timer control block address
+ *
+ */
+
+MER_STATUS mer_service_timer_set_suspend_max_delay(mer_uint16 delay);
+/**
+ * cancel the max delay for task suspend timer,
+ * note that this function will not start a timer
+ * -1 will be returned if creation fails
+ *
+ * @param[out] MER_STATUS Success = 0, Fail = -1.
+ * @param[in] task_id task to set
+ * @param[in] dealy maximum allowable delay for this timer
+ *
+ */
+MER_STATUS mer_service_timer_cancel_suspend_max_delay();
+
+/**
+ * get the remaining time of the timer
+ * if the timer is not running or expired, it will return 0
+ *
+ * @param[out] MER_UINT32 remaining time, 0 if the timer is not running or expired
+ * @param[in] task_id task to cancel
+ *
+ */
+
+mer_uint32 mer_service_timer_get_remaining_time(mer_service_timer_id tid);
+
+/**
+ * handle the timers in dpc
+ * -1 will be returned if creation fails
+ *
+ * @param[out] MER_STATUS Success = 0, Fail = -1.
+ *
+ */
+MER_STATUS mer_service_timer_expiration();
+
+static inline mer_bool mer_service_timer_is_expired(mer_service_timer_id tid)
+{
+ mer_uint32 now = mer_kernel_timer_get_current_tick();
+ mer_uint32 start_time = tid->expiration - tid->delay;
+ mer_bool is_wrap = (tid->expiration < start_time);
+
+ if((!is_wrap && !(now >= start_time && now < tid->expiration)) ||
+ (is_wrap && now >= tid->expiration && now < start_time)) {
+ return MER_TRUE;
+ }
+ else {
+ return MER_FALSE;
+ }
+}
+
+/*#define MER_SERVICE_TIMER_DEBUG*/
+
+// we do not have many tasks, 256 should be enough
+#ifdef MER_SERVICE_TIMER_DEBUG
+
+#define MER_SERVICE_TIMER_GLOBAL_COUNT (256)
+#define MER_SERVICE_TIMER_GLOBAL_GUARD_PATTERN (0x5566dead)
+/*global timer*/
+/*global timer*/
+/*global timer*/
+typedef struct _mer_service_timer_global
+{
+ mer_uint32 guard_front;
+ mer_service_task_id owner;
+ mer_uint32 working;
+ mer_service_timer timer;
+ mer_uint32 guard_back;
+} mer_service_timer_global;
+
+typedef mer_service_timer_global *mer_service_timer_global_id;
+
+mer_service_timer_id get_mer_service_timer_cb_global(mer_service_task_id task_id);
+void check_mer_service_timer_cb_global(mer_service_timer_id tid);
+void release_mer_service_timer_cb_global(mer_service_timer_id tid);
+
+typedef enum {
+ MER_SERVICE_TIMER_TRACE_OP_SET = 0,
+ MER_SERVICE_TIMER_TRACE_OP_STOP = 1,
+ MER_SERVICE_TIMER_TRACE_OP_SUSPEND = 2,
+} mer_service_timer_trace_op;
+
+typedef struct _mer_service_timer_trace {
+ mer_service_timer_id tid;
+ kal_uint32 now;
+ kal_uint32 expiration;
+ kal_uint32 reschedule;
+ kal_uint32 max_delay;
+ kal_uint32 lr;
+ mer_service_timer_trace_op op;
+} mer_service_timer_trace;
+
+void mer_service_timer_set_trace(mer_service_timer_id tid,
+ kal_uint32 delay,
+ kal_uint32 reschedule,
+ kal_uint32 lr, mer_service_timer_trace_op op);
+
+#endif /* MER_SERVICE_TIMER_DEBUG */
+
+#endif /* _MER_SERVICE_TIMER_H */
+
diff --git a/mcu/service/mertos/include/mer_service_types.h b/mcu/service/mertos/include/mer_service_types.h
new file mode 100644
index 0000000..87918d0
--- /dev/null
+++ b/mcu/service/mertos/include/mer_service_types.h
@@ -0,0 +1,87 @@
+/*****************************************************************************
+* 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) 2018
+*
+* 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:
+* ---------
+* mer_service_types.h
+*
+* Project:
+* --------
+* MERTOS
+*
+* Description:
+* ------------
+* Declare predefinded types.
+*
+* Author:
+* -------
+ * -------
+*
+*****************************************************************************/
+
+#ifndef _MER_SERVICE_TYPES_H_
+#define _MER_SERVICE_TYPES_H_
+
+#include "mer_kernel_config_public.h"
+
+#if !MER_KERNEL_IS_ASSEMBLY
+
+enum{
+ MER_FALSE,
+ MER_TRUE
+};
+
+typedef int MER_STATUS;
+typedef char mer_bool;
+typedef char mer_int8;
+typedef short mer_int16;
+typedef int mer_int32;
+typedef char mer_char;
+typedef unsigned char mer_uint8;
+typedef unsigned short mer_uint16;
+typedef unsigned int mer_uint32;
+typedef unsigned long long mer_uint64;
+typedef mer_uint8 *mer_mem_ptr;
+typedef mer_uint8 mer_lock;
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#endif /* MER_KERNEL_IS_ASSEMBLY */
+
+#endif /* _MER_SERVICE_TYPES_H_ */