diff --git a/mcu/interface/driver/peripheral/bmt.h b/mcu/interface/driver/peripheral/bmt.h
new file mode 100644
index 0000000..df34a3f
--- /dev/null
+++ b/mcu/interface/driver/peripheral/bmt.h
@@ -0,0 +1,857 @@
+/*****************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2005
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ *    bmt.h
+ *
+ * Project:
+ * --------
+ *   Maui_Software
+ *
+ * Description:
+ * ------------
+ *   This file is intends for Battery Management Task.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ *             HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#ifndef _BMT_H
+#define _BMT_H
+
+#include "kal_general_types.h"
+#include "kal_public_defs.h"
+#include "dcl.h"
+#include "adc_cali.h"
+
+#define ADC_BMT_VBAT            0
+#define ADC_BMT_VISENSE         1
+#define ADC_BMT_VBATTMP         2
+#define ADC_BMT_VCHARGER	    3
+#define ADC_BMT_MAX_CHANNEL_TOTAL   4
+//#define BMT_MAX_CHANNEL_TOTAL       ADC_BMT_MAX_CHANNEL_TOTAL  // backward compatible
+
+/*
+#ifdef __BMT_CHECK_CHARGER__
+#define BMT_MAX_CHANNEL    4
+#else
+#define BMT_MAX_CHANNEL    3
+#endif
+*/
+#define BMT_ADC_VBAT            0
+#define BMT_ADC_VISENSE         1
+#define BMT_ADC_VBATTMP         2
+#define BMT_ADC_VCHARGER	    3
+#define BMT_ADC_MAX_CHANNEL_TOTAL   4
+
+/*precharge threshold*/
+#define BMT_PRECHARGE_THRESHOLD  3300000
+
+#if defined(__TC01__)
+#define DRV_BMT_NONE_USB_POWER_ON /* use charging power on instead of USB power on*/
+#define __DRV_BMT_PRECHARGE_TO_FULL_DIRECTLY__
+#endif // #if defined(__TC01__)
+
+/*BatType*/
+#define  LIBAT                            0
+#define  NIBAT                            1
+
+/*extern charger state*/
+#define  DETECTCHRIN                      0x0
+#define  DETECTCHROUT                     !DETECTCHRIN
+
+/*BMT Minor STATE. When Charger is plugged in, charge is enable or not?*/
+#define  PMIC_CHARGEOFF                   0   /*pmictrl_state*/
+#define  PMIC_CHARGEON                    1   
+
+/*MS Mode*/
+#define idle_mode                         0
+#define talk_mode                         1
+#define swoff_mode                        2
+
+
+#define BMT_HIGH_VCHG_THRESHOLD 100000
+
+#if defined(DRV_BMT_HIGH_VCHG_ADAPTIVE_CHARGE_CURRENT_SUPPORT)
+#define VCHG_VOL_LEVEL      7
+#define VCHG_PARAMTER_COUNT 3
+
+typedef struct{
+    kal_uint32 VCHG_HV_VTH;
+    kal_int32 HIGH_VCHG_TABLE[VCHG_VOL_LEVEL][VCHG_PARAMTER_COUNT];
+}bmt_customized_high_vchg_struct;
+
+extern kal_bool High_Vchg_Safety_Timer_Set;
+extern bmt_customized_high_vchg_struct *bmt_high_vchg_para;
+extern kal_uint32 bmt_total_charge_time;
+extern kal_bool bmt_safety_timer_config;
+extern kal_int32 Pre_VCharge_AVG;
+extern kal_int32 Cur_VCharge_MAX;
+extern bmt_customized_high_vchg_struct *bmt_get_customized_high_vchg_para(void);
+
+#endif // End of #if defined(DRV_BMT_HIGH_VCHG_ADAPTIVE_CHARGE_CURRENT_SUPPORT)
+
+typedef enum{
+	CHARGER_PRESENT,
+//#if defined(__CHINA_CHARGER_STANDARD__)
+	CHARGER_PRESENT_NON,
+//#endif
+	USB_PRESENT,
+	NO_PRESENT
+}charger_usb_present_enum;
+
+typedef enum{
+	BMT_AC_CHR,
+	BMT_USB_CHR
+}bmt_charger_type;
+
+typedef enum {
+	bmt_chr_in=0,
+   bmt_chr_out,
+   bmt_chr_uninit = 0xff
+}Charger_Status;
+
+typedef enum {
+	VBAT_UEM_CHR_OUT=0,
+	VBAT_UEM_CHR_OUT_FIRST=1,
+	VBAT_UEM_CHR_IN=2,
+	VBAT_UEM_CHR_IN_FISRT=3
+}VBAT_UEM_CHR_ENUM;
+
+typedef enum 
+{
+   CHR_CURRENT_50=0,
+   CHR_CURRENT_90,
+   CHR_CURRENT_150,
+   CHR_CURRENT_225,
+   CHR_CURRENT_300,
+   CHR_CURRENT_450,
+   CHR_CURRENT_650,
+   CHR_CURRENT_800
+}pmic_charging_current;
+
+typedef struct {
+   kal_uint8               bat_state;
+   kal_uint8               pmictrl_state;   /*pmic control on,off*/
+   kal_uint8               call_state;   /*mobile state*/
+  // kal_uint8               PWRon;
+   kal_uint8               BatType;
+   kal_uint8               EINT2STATE;
+   kal_uint8               highfull;
+   VBAT_UEM_CHR_ENUM		     VBAT_UEM; // state of UEM VBAT measurement 
+   kal_hisrid              hisr;
+} BMTStruct;
+
+typedef struct {
+   kal_int32 VBAT;
+   kal_int32 ICHARGE;
+   kal_int32 BATTMP;
+   kal_int32 VCHARGER;
+   kal_int32 ISense_Offset;
+   //kal_uint8 BATTYPE;
+} BATPHYStruct;
+
+
+// For external charger mechanism integration
+
+// The enum is to indicate whether the charging factor is measured by HOST or Charger device
+typedef enum
+{
+  CHR_FACTOR_MEASURE_NONE =             0x00000000,   // Both NOT support, TBD
+  CHR_FACTOR_MEASURE_BY_HOST =          0x00000001,   // BIT00, HOST measure the specific charging factor
+  CHR_FACTOR_MEASURE_BY_CHARGER_DEV =   0x00000002    // BIT01, Charger device measure the specific charging factor
+
+}bmt_chr_fac_measure_support_enum;
+
+// The enum is to indicate whether the charging factor error check is done by HOST or charger device
+typedef enum
+{
+  BMT_CHR_FACTOR_CHECK_NONE =           0x00000000,   // Both NOT support, TBD
+  BMT_CHR_FACTOR_CHECK_BY_HOST =        0x00000001,   // BIT00, HOST perform charging factor error check
+  BMT_CHR_FACTOR_CHECK_BY_CHARGER_DEV = 0x00000002    // BIT01, Charger device perform charging facotr error check
+
+}bmt_chr_fac_check_support_enum;
+
+// The enum defines the charging factors that charging process need to check
+typedef enum
+{
+  BMT_CHR_FACTOR_VBAT,               // Charging factor: VBAT
+  BMT_CHR_FACTOR_ISENSE,             // Charging factor: VISENSE
+  BMT_CHR_FACTOR_BATTMP,             // Charging factor: VBAT temperature
+  BMT_CHR_FACTOR_VCHARGER,           // Charging factor: VCHARGER
+  BMT_CHR_FACTOR_CHARGER_OVP,        // Charging factor: Charger OVP
+  BMT_CHR_FACTOR_CHARGE_FULL,        // Charging factor: Charge full
+  BMT_CHR_FACTOR_UNDER_EXTREMETMP,        // Charging factor: Extreme temperature
+  BMT_CHR_FACTOR_CHARGE_EXTREMETMP_FULL,        // Charging factor: Charge full under extreme temperature
+  BMT_CHR_FACTOR_CHARGE_EXTREMETMP_RECHARGE,        // Charging factor: Should recharge under extreme temperature
+  BMT_CHR_FACTOR_HOLD,               // Charging factor: Charging hold
+  BMT_CHR_FACTOR_CHR_BATT_STATE,     // Charging factor: charging state: PRE, FAST(CC), TOPOFF(CV), FULL ...
+
+  BMT_CHR_FACTOR_MAX
+}bmt_chr_fac_enum;
+
+typedef struct
+{
+
+  // Driver init
+  // Called at drv init phase
+  void (*drv_init)(void);
+
+  // Called at pmic adpt layer init phase
+  // The phase what scheduler is running(BMT task is created)
+  void (*enable_intr)(void);
+
+  // Control charge enable/disable
+  // Called at any time, any context
+  kal_bool (*charge_enable)(kal_bool enable);
+
+  // The unit is in mA ==> 1000 means 1A
+  // Called at any time, any context
+  // a most close, but not exceeded charge current will be selected
+  // 500mA means can NOT large than 500mA, but most close to 500mA
+  kal_bool (*set_charge_current)(kal_int32 charge_current);
+
+  // Whether the external charger can measure the passed-in charging factor
+  bmt_chr_fac_measure_support_enum (*get_chr_fac_measure_support)(bmt_chr_fac_enum chr_fac);
+
+  // Whether the external charger can check the passed-in charging factor
+  bmt_chr_fac_check_support_enum (*get_chr_fac_check_support)(bmt_chr_fac_enum chr_fac);
+
+  // Pass information to charger device
+  // Charger device can calculate the charger status through the passed-in info
+  void (*check_chr_status)(BATPHYStruct *pBatPhysStat);
+
+  // Charger return calculated charger status
+  // Usually, charger device should keep the chr status before reset_chr_status() is called
+  // The return kal_uint32 is union of all charging factors status
+  kal_uint32 (*get_chr_status)(void);
+
+  // The return unit is uV ==> 1000000 means 1.0V
+  // The passed-in parameter is the information measured by HOST,
+  // ext charger driver need this info to calculate
+  kal_int32 (*get_vbat)(BATPHYStruct *pBatPhysStat);
+
+  // The return unit is uA ==> 1000000 means 1A
+  // The passed-in parameter is the information measured by HOST,
+  // ext charger driver need this info to calculate
+  kal_int32 (*get_isense)(BATPHYStruct *pBatPhysStat);
+
+  // The return unit is uV ==> 1000000 means 1.0V
+  // The passed-in parameter is the information measured by HOST,
+  // ext charger driver need this info to calculate
+  kal_int32 (*get_vcharger)(BATPHYStruct *pBatPhysStat);
+
+  // Return the calculated NTC value of battery temperature
+  // The passed-in parameter is the information measured by HOST,
+  // ext charger driver need this info to calculate
+  kal_int32 (*get_bat_temp)(BATPHYStruct *pBatPhysStat);
+
+  // Return if charge full
+  // The unit is vbat is uV ==> 1000000 means 1.0V
+  // Return KAL_TRUE: Charge full
+  // Return KAL_FALSE: Not charge full
+  kal_bool (*get_charge_full)(kal_int32 vbat);
+
+  // Return if it's under extreme temperature
+  // Return KAL_TRUE: It's under extreme temperature
+  // Return KAL_FALSE: It's NOT under extreme temperature
+  kal_bool (*get_charge_under_extremetmp)(kal_int32 battmp);
+
+  // Return if charge full when under extreme temperature
+  // The unit is vbat is uV ==> 1000000 means 1.0V
+  // Return KAL_TRUE: Charge full
+  // Return KAL_FALSE: Not charge full
+  kal_bool (*get_charge_extremetmp_full)(kal_int32 vbat);
+
+  // Return if charge should recharge when under extreme temperature
+  // The unit is vbat is uV ==> 1000000 means 1.0V
+  // Return KAL_TRUE: Should recharge
+  // Return KAL_FALSE: Should NT recharge
+  kal_bool (*get_charge_extremetmp_recharge)(kal_int32 vbat);
+
+  // Return KAL_TRUE: Need to hold charging
+  // Return KAL_FALSE: Do NOT need to hold charging
+  // The condition to hold charging: Talking mode ...
+  kal_bool (*get_charge_hold)(BATPHYStruct *pBatPhysStat);
+
+  // Whether the external charger can handle the specific charging battery state
+  bmt_chr_fac_check_support_enum(*get_chr_batt_state_transit_support)(kal_uint32 curr_chr_batt_state);
+
+  // Perform charging battery state transit
+  // curr_chr_batt_state: Current state
+  // chr_on: Current CHR_EN state
+  void (*chr_batt_state_transit)(kal_uint32 curr_chr_batt_state, kal_bool chr_en);
+
+  // Get current charging battery state PRE, FAST(CC), TOPOFF(CV), FULL, ...
+  kal_uint32 (*get_curr_chr_batt_state)(BATPHYStruct *pBatPhysStat);
+
+  // Get custom charge current according to specific charger
+  kal_uint32 (*get_specific_chr_current)(bmt_charger_type charger);
+
+  // Whether the vbat is higher than specific full check vaule or not
+  // Return KAL_TRUE: higher than specific full voltage
+  // Return KAL_FALSE: lower than specific full voltage
+  kal_bool (*get_vbat_specific_full_voltage_state)(kal_int32 vbat); //__DRV_BMT_CHARGING_COMPLETE_MSG__
+
+}bmt_ext_charger;
+
+// External charger custom table V1.0
+typedef struct{
+  // Control enable/disable charger
+  void (*charge_enable)(kal_bool enable);
+
+  // Set charge current
+  // The unit is mA ==> 1000 means 1A
+  void (*charge_current)(kal_int32 current);
+
+  // Return KAL_TRUE: Charger think battery is full
+  // Return KAL_FALSE: Charger think battery is NOT full
+  kal_bool (*charge_full_ind)(kal_int32 vbat);
+
+  // Return KAL_TRUE: Charger thing it's under extreme temperature
+  // Return KAL_FALSE: Charger thing it's NOT under extreme temperature
+  kal_bool (*charge_under_extremetmp_ind)(kal_int32 battmp);
+
+  // Return KAL_TRUE: Charger think battery is full if it's under extreme temperature
+  // Return KAL_FALSE: Charger think battery is NOT if it's full under extreme temperature
+  kal_bool (*charge_extremetmp_full_ind)(kal_int32 vbat);
+
+  // Return KAL_TRUE: Charger think battery should be recharged if it's under extreme temperature
+  // Return KAL_FALSE: Charger think battery should NOT be recharged if it's under extreme temperature
+  kal_bool (*charge_extremetmp_recharge_ind)(kal_int32 vbat);
+
+  // Number of charge current level (Ex: 100mA, 150mA, 500mA ...)
+  kal_uint32 charge_current_num;
+
+  // The current must be listed from largest to smallest
+  // Ex: 0: 500mA; 1: 250mA; 2: 100mA ...
+  kal_uint32 *charge_current_table;
+
+  // Return the custom charge current for specific charger type, the unit is mA
+  kal_uint32 (*get_custom_charge_current)(bmt_charger_type charger);
+
+  // Whether the charge source is good
+  // Return KAL_TRUE: Charge source is good
+  // Return KAL_FALSE: Charge source is NOT good
+  kal_bool (*charge_source_good)(void);
+
+  // Whether the vbat is higher than specific full check vaule or not
+  // Return KAL_TRUE: higher than specific full voltage
+  // Return KAL_FALSE: lower than specific full voltage
+  kal_bool (*vbat_specific_full_check_voltage)(kal_int32 vbat); //__DRV_BMT_CHARGING_COMPLETE_MSG__
+
+}bmt_ext_charger_custom_config;
+
+
+// For external charger mechanism integration
+
+
+// For external charger detection integration
+typedef struct
+{
+  // This API report charger in/out and AC or USB type together
+  // This API may be called at anytime
+  // Ex: Before scheduler is running (Boot init phase)
+  //     Called at boot time (No scheduler is running)
+  //     Called in HISR (Drv_HISR and system HISR)
+  //     Called in Task
+  charger_usb_present_enum (*det_charger_present)(void);
+
+  // This API is for PWIC to register HISR handler for charger
+  // PWIC will use det_charger_present() to determine whether it is in/out
+  void (*reg_chr_hisr)(void (chr_hisr_callback)(void));
+
+  // This API is for PWIC to register HISR handler for usb
+  // PWIC will use det_charger_present() to determine whether it is in/out
+  void (*reg_usb_hisr)(void (usb_hisr_callback)(void));
+
+  // This API is to set S/W debounce time for charger cable
+  // The uint of deb_time is in 10ms (GPT tick)
+  void (*set_chr_deb_time)(kal_uint32 deb_time);
+
+  // This API is to set S/W debounce time for usb cable
+  // The uint of deb_time is in 10ms (GPT tick)
+  void (*set_usb_deb_time)(kal_uint32 deb_time);
+
+  // This API is to report whether USB detection is supported or NOT
+  kal_bool (*support_usb_det)(void);
+
+  // Init the external charger detection mechanism
+  // The API is called at boot phase
+  // After this call, we should be able to call det_charger_present()
+  // Provider need to guarantee this
+  void (*drv_init)(void);
+
+  // The API is called at pmic adpt layer init phase
+  void (*enable_intr)(void);
+
+}bmt_ext_charger_det;
+
+typedef enum
+{
+  EXT_CABLE_PATH_CHARGER,
+  EXT_CABLE_PATH_STD_USB,
+  EXT_CABLE_PATH_HIGH_CURRENT_USB,
+  EXT_CABLE_PATH_UART,
+  EXT_CABLE_PATH_EARPHONE,
+  EXT_CABLE_PATH_TV_OUT,
+  EXT_CABLE_PATH_USB_OTG,
+  EXT_CABLE_PATH_FAC_UART,
+  EXT_CABLE_PATH_FAC_USB,
+  EXT_CABLE_PATH_CS_CHARGER,  // Customer specific charger
+  EXT_CABLE_PATH_MAX
+}ext_cable_path_enum;
+
+typedef struct
+{
+  // Factory mode API
+  // Force switch external cable to specific path for test
+  void (*set_path)(ext_cable_path_enum path);
+
+  // Factory mode API
+  // Return current external cable path
+  ext_cable_path_enum (*get_curr_path)(void);
+
+  // ASSERT mode API
+  // Called when system enter ASSERT, 
+  // the ext cable mechanism should switch cable path for memory dump
+  void (*ext_cable_force_set_path)(ext_cable_path_enum path);
+
+  // API for specific workaround: Turn on/off ext cable path
+  void (*ext_cable_WA_set_path)(ext_cable_path_enum path, kal_bool on);
+
+}ext_cable_det_fac_if;
+
+
+// For external charger detection integration
+
+extern kal_uint8  bmt_bmtid_adc_handle[BMT_ADC_MAX_CHANNEL_TOTAL];
+extern kal_uint8  bmt_adc_handle;
+
+// MoDIS parser skip start
+// The following APIs are impmemented in custom folder, which will be inclucded in MoDIS
+/*usb charge*/
+extern kal_bool bmt_support_usb_charge(void);
+extern kal_int32 bmt_get_chr_usb_detect_volt(void);
+// MoDIS parser skip end
+
+// MoDIS parser skip start
+/*charing parameters*/
+// MoDIS parser skip end
+
+#if defined(__GENERAL_EXTERNAL_CHARGER__)
+extern bmt_ext_charger *ext_charger; // Variable in pwic.c
+extern bmt_ext_charger *bmt_get_ext_charger(void);
+extern bmt_ext_charger_custom_config *bmt_ext_charger_get_custom_config(void);
+#endif // #if defined(__GENERAL_EXTERNAL_CHARGER__)
+
+extern ext_cable_det_fac_if *custom_get_ext_cable_fac(void);
+
+#if defined(__DRV_EXT_CHARGER_DETECTION__)
+extern bmt_ext_charger_det *ext_charger_det;
+extern bmt_ext_charger_det *bmt_custom_get_ext_charger_det(void);
+#endif // #if defined(__DRV_EXT_CHARGER_DETECTION__)
+
+extern kal_uint8 BMT_MAX_CHANNEL;      // The ADC channel number in BMT (Used for charging factor monitoring)
+extern BMTStruct BMT;
+
+#if defined(DRV_ADC_CALIBRATION_EFUSE)
+extern kal_bool bmt_read_calibration_data(ADC_CALIDATA *adc_cali);
+#endif //#if defined(DRV_ADC_CALIBRATION_EFUSE)
+
+extern void BMT_VbatInHISR(void);
+extern kal_bool bmt_is_bat_on(void);
+
+extern kal_bool BMT_ObtainBMTPHYSTAT(BATPHYStruct *BATPHYS);
+extern void bmt_chr_force_enable(kal_bool enable);
+extern kal_bool bmt_is_chr_valid(void);
+extern kal_bool bmt_get_chr_cv_det(void);
+#endif // End of #ifndef _BMT_H
+
