Add basic change for v1453

Change-Id: I9497a61bbc3717f66413794a4e7dee0347c0bc33
diff --git a/mbtk/include/ql_v2/ql_voice.h b/mbtk/include/ql_v2/ql_voice.h
new file mode 100755
index 0000000..0882a66
--- /dev/null
+++ b/mbtk/include/ql_v2/ql_voice.h
@@ -0,0 +1,1069 @@
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @file ql_voice.h 
+  @brief Voice service API. 
+*/
+/*-----------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  Copyright (c) 2019 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
+  Quectel Wireless Solution Proprietary and Confidential.
+-------------------------------------------------------------------------------------------------*/
+
+/*-------------------------------------------------------------------------------------------------
+  EDIT HISTORY
+  This section contains comments describing changes made to the file.
+  Notice that changes are listed in reverse chronological order.
+  $Header: $
+  when       who          what, where, why
+  --------   ---          ----------------------------------------------------------
+  20210622   Rambo.shan   Added Voice DSDA API.
+  20210203   Rambo.shan   Added Voice bind API for DSDA.
+  20210104   Rambo.shan   Added DTMF event indication.
+  20200928   Rambo.shan   Added eCall set option of T3.
+  20200907   Rambo.shan   Added SETUP voice state.
+  20200622   Rambo.shan   Add eCall auto answer function
+  20191225   solomon.cui  Modify fucntion description.
+  20191111   solomon.cui  Add eCall APIs.
+  20190815   solomon.cui  Add service type for sending message.
+  20190625   solomon.cui  Created.
+-------------------------------------------------------------------------------------------------*/
+#include <stdint.h>
+
+#define QL_VOICE_MAX_PHONE_NUMBER       (82)
+#define QL_VOICE_MAX_RECORDS            (8)
+#define QL_VOICE_MAX_DTMF_LENGTH        (20)
+#define QL_VOICE_MAX_FW_DETAIL_LENGTH   (13)
+#define QL_VOICE_MAX_ECALL_MSD          (140)
+
+typedef enum 
+{
+    QL_VOICE_STATE_INCOMING = 0x0000, /**< Call is incoming. */
+    QL_VOICE_STATE_DIALING  = 0x0001, /**< Dialing state. */
+    QL_VOICE_STATE_ALERTING = 0x0002, /**< Alterting. */
+    QL_VOICE_STATE_ACTIVE   = 0x0003, /**< Call is active. */
+    QL_VOICE_STATE_HOLDING  = 0x0004, /**< Call is on hold. */
+    QL_VOICE_STATE_END      = 0x0005, /**< Call is disconnected. */
+    QL_VOICE_STATE_WAITING  = 0x0006, /**< Call is waiting. */
+    QL_VOICE_STATE_SETUP    = 0x0007, /**< MT Call is in Setup state in 3GPP. */
+} QL_VOICE_STATE_E;
+
+typedef enum
+{
+    QL_VOICE_TECH_NONE  = 0, /**< None. */
+    QL_VOICE_TECH_3GPP  = 1, /**< 3GPP. */
+    QL_VOICE_TECH_3GPP2 = 2, /**< 3GPP2. */
+} QL_VOICE_TECH_E;
+
+typedef enum
+{
+    QL_VOICE_DIR_MO = 0, /**< Mobile originated call */
+    QL_VOICE_DIR_MT = 1, /**< Mobile terminated call */
+} QL_VOICE_DIR_E;
+
+typedef enum
+{
+    VOICE_CALL_EVENT,
+    VOICE_MUTE_EVENT,
+    VOICE_DTMF_EVENT,
+    VOICE_ECALL_EVENT,
+    VOICE_ECALL_STATUS,
+} VOICE_EVENT_E;
+
+typedef enum
+{
+    QL_VOICE_END_REASON_NONE                                                    = 0, 
+    QL_VOICE_END_REASON_OFFLINE                                                 = 1, 
+    QL_VOICE_END_REASON_CDMA_LOCK                                               = 2, 
+    QL_VOICE_END_REASON_NO_SRV                                                  = 3, 
+    QL_VOICE_END_REASON_FADE                                                    = 4, 
+    QL_VOICE_END_REASON_INTERCEPT                                               = 5, 
+    QL_VOICE_END_REASON_REORDER                                                 = 6, 
+    QL_VOICE_END_REASON_REL_NORMAL                                              = 7, 
+    QL_VOICE_END_REASON_REL_SO_REJ                                              = 8, 
+    QL_VOICE_END_REASON_INCOM_CALL                                              = 9, 
+    QL_VOICE_END_REASON_ALERT_STOP                                              = 10, 
+    QL_VOICE_END_REASON_CLIENT_END                                              = 11, 
+    QL_VOICE_END_REASON_ACTIVATION                                              = 12, 
+    QL_VOICE_END_REASON_MC_ABORT                                                = 13, 
+    QL_VOICE_END_REASON_MAX_ACCESS_PROBE                                        = 14, 
+    QL_VOICE_END_REASON_PSIST_N                                                 = 15, 
+    QL_VOICE_END_REASON_UIM_NOT_PRESENT                                         = 16, 
+    QL_VOICE_END_REASON_ACC_IN_PROG                                             = 17, 
+    QL_VOICE_END_REASON_ACC_FAIL                                                = 18, 
+    QL_VOICE_END_REASON_RETRY_ORDER                                             = 19, 
+    QL_VOICE_END_REASON_CCS_NOT_SUPPORTED_BY_BS                                 = 20, 
+    QL_VOICE_END_REASON_NO_RESPONSE_FROM_BS                                     = 21, 
+    QL_VOICE_END_REASON_REJECTED_BY_BS                                          = 22, 
+    QL_VOICE_END_REASON_INCOMPATIBLE                                            = 23, 
+    QL_VOICE_END_REASON_ACCESS_BLOCK                                            = 24, 
+    QL_VOICE_END_REASON_ALREADY_IN_TC                                           = 25, 
+    QL_VOICE_END_REASON_EMERGENCY_FLASHED                                       = 26, 
+    QL_VOICE_END_REASON_USER_CALL_ORIG_DURING_GPS                               = 27, 
+    QL_VOICE_END_REASON_USER_CALL_ORIG_DURING_SMS                               = 28, 
+    QL_VOICE_END_REASON_USER_CALL_ORIG_DURING_DATA                              = 29, 
+    QL_VOICE_END_REASON_REDIR_OR_HANDOFF                                        = 30, 
+    QL_VOICE_END_REASON_ACCESS_BLOCK_ALL                                        = 31, 
+    QL_VOICE_END_REASON_OTASP_SPC_ERR                                           = 32, 
+    QL_VOICE_END_REASON_IS707B_MAX_ACC                                          = 33, 
+    QL_VOICE_END_REASON_ACC_FAIL_REJ_ORD                                        = 34, 
+    QL_VOICE_END_REASON_ACC_FAIL_RETRY_ORD                                      = 35, 
+    QL_VOICE_END_REASON_TIMEOUT_T42                                             = 36, 
+    QL_VOICE_END_REASON_TIMEOUT_T40                                             = 37, 
+    QL_VOICE_END_REASON_SRV_INIT_FAIL                                           = 38, 
+    QL_VOICE_END_REASON_T50_EXP                                                 = 39, 
+    QL_VOICE_END_REASON_T51_EXP                                                 = 40, 
+    QL_VOICE_END_REASON_RL_ACK_TIMEOUT                                          = 41, 
+    QL_VOICE_END_REASON_BAD_FL                                                  = 42, 
+    QL_VOICE_END_REASON_TRM_REQ_FAIL                                            = 43, 
+    QL_VOICE_END_REASON_TIMEOUT_T41                                             = 44, 
+    QL_VOICE_END_REASON_INCOM_REJ                                               = 45, 
+    QL_VOICE_END_REASON_SETUP_REJ                                               = 46, 
+    QL_VOICE_END_REASON_NETWORK_END                                             = 47, 
+    QL_VOICE_END_REASON_NO_FUNDS                                                = 48, 
+    QL_VOICE_END_REASON_NO_GW_SRV                                               = 49, 
+    QL_VOICE_END_REASON_NO_CDMA_SRV                                             = 50, 
+    QL_VOICE_END_REASON_NO_FULL_SRV                                             = 51, 
+    QL_VOICE_END_REASON_MAX_PS_CALLS                                            = 52, 
+    QL_VOICE_END_REASON_UNKNOWN_SUBSCRIBER                                      = 53, 
+    QL_VOICE_END_REASON_ILLEGAL_SUBSCRIBER                                      = 54, 
+    QL_VOICE_END_REASON_BEARER_SERVICE_NOT_PROVISIONED                          = 55, 
+    QL_VOICE_END_REASON_TELE_SERVICE_NOT_PROVISIONED                            = 56, 
+    QL_VOICE_END_REASON_ILLEGAL_EQUIPMENT                                       = 57, 
+    QL_VOICE_END_REASON_CALL_BARRED                                             = 58, 
+    QL_VOICE_END_REASON_ILLEGAL_SS_OPERATION                                    = 59, 
+    QL_VOICE_END_REASON_SS_ERROR_STATUS                                         = 60, 
+    QL_VOICE_END_REASON_SS_NOT_AVAILABLE                                        = 61, 
+    QL_VOICE_END_REASON_SS_SUBSCRIPTION_VIOLATION                               = 62, 
+    QL_VOICE_END_REASON_SS_INCOMPATIBILITY                                      = 63, 
+    QL_VOICE_END_REASON_FACILITY_NOT_SUPPORTED                                  = 64, 
+    QL_VOICE_END_REASON_ABSENT_SUBSCRIBER                                       = 65, 
+    QL_VOICE_END_REASON_SHORT_TERM_DENIAL                                       = 66, 
+    QL_VOICE_END_REASON_LONG_TERM_DENIAL                                        = 67, 
+    QL_VOICE_END_REASON_SYSTEM_FAILURE                                          = 68, 
+    QL_VOICE_END_REASON_DATA_MISSING                                            = 69, 
+    QL_VOICE_END_REASON_UNEXPECTED_DATA_VALUE                                   = 70, 
+    QL_VOICE_END_REASON_PWD_REGISTRATION_FAILURE                                = 71, 
+    QL_VOICE_END_REASON_NEGATIVE_PWD_CHECK                                      = 72, 
+    QL_VOICE_END_REASON_NUM_OF_PWD_ATTEMPTS_VIOLATION                           = 73, 
+    QL_VOICE_END_REASON_POSITION_METHOD_FAILURE                                 = 74, 
+    QL_VOICE_END_REASON_UNKNOWN_ALPHABET                                        = 75, 
+    QL_VOICE_END_REASON_USSD_BUSY                                               = 76, 
+    QL_VOICE_END_REASON_REJECTED_BY_USER                                        = 77, 
+    QL_VOICE_END_REASON_REJECTED_BY_NETWORK                                     = 78, 
+    QL_VOICE_END_REASON_DEFLECTION_TO_SERVED_SUBSCRIBER                         = 79, 
+    QL_VOICE_END_REASON_SPECIAL_SERVICE_CODE                                    = 80, 
+    QL_VOICE_END_REASON_INVALID_DEFLECTED_TO_NUMBER                             = 81, 
+    QL_VOICE_END_REASON_MPTY_PARTICIPANTS_EXCEEDED                              = 82, 
+    QL_VOICE_END_REASON_RESOURCES_NOT_AVAILABLE                                 = 83, 
+    QL_VOICE_END_REASON_UNASSIGNED_NUMBER                                       = 84, 
+    QL_VOICE_END_REASON_NO_ROUTE_TO_DESTINATION                                 = 85, 
+    QL_VOICE_END_REASON_CHANNEL_UNACCEPTABLE                                    = 86, 
+    QL_VOICE_END_REASON_OPERATOR_DETERMINED_BARRING                             = 87, 
+    QL_VOICE_END_REASON_NORMAL_CALL_CLEARING                                    = 88, 
+    QL_VOICE_END_REASON_USER_BUSY                                               = 89, 
+    QL_VOICE_END_REASON_NO_USER_RESPONDING                                      = 90, 
+    QL_VOICE_END_REASON_USER_ALERTING_NO_ANSWER                                 = 91, 
+    QL_VOICE_END_REASON_CALL_REJECTED                                           = 92, 
+    QL_VOICE_END_REASON_NUMBER_CHANGED                                          = 93, 
+    QL_VOICE_END_REASON_PREEMPTION                                              = 94, 
+    QL_VOICE_END_REASON_DESTINATION_OUT_OF_ORDER                                = 95, 
+    QL_VOICE_END_REASON_INVALID_NUMBER_FORMAT                                   = 96, 
+    QL_VOICE_END_REASON_FACILITY_REJECTED                                       = 97, 
+    QL_VOICE_END_REASON_RESP_TO_STATUS_ENQUIRY                                  = 98, 
+    QL_VOICE_END_REASON_NORMAL_UNSPECIFIED                                      = 99, 
+    QL_VOICE_END_REASON_NO_CIRCUIT_OR_CHANNEL_AVAILABLE                         = 100, 
+    QL_VOICE_END_REASON_NETWORK_OUT_OF_ORDER                                    = 101, 
+    QL_VOICE_END_REASON_TEMPORARY_FAILURE                                       = 102, 
+    QL_VOICE_END_REASON_SWITCHING_EQUIPMENT_CONGESTION                          = 103, 
+    QL_VOICE_END_REASON_ACCESS_INFORMATION_DISCARDED                            = 104, 
+    QL_VOICE_END_REASON_REQUESTED_CIRCUIT_OR_CHANNEL_NOT_AVAILABLE              = 105, 
+    QL_VOICE_END_REASON_RESOURCES_UNAVAILABLE_OR_UNSPECIFIED                    = 106, 
+    QL_VOICE_END_REASON_QOS_UNAVAILABLE                                         = 107, 
+    QL_VOICE_END_REASON_REQUESTED_FACILITY_NOT_SUBSCRIBED                       = 108, 
+    QL_VOICE_END_REASON_INCOMING_CALLS_BARRED_WITHIN_CUG                        = 109, 
+    QL_VOICE_END_REASON_BEARER_CAPABILITY_NOT_AUTH                              = 110, 
+    QL_VOICE_END_REASON_BEARER_CAPABILITY_UNAVAILABLE                           = 111, 
+    QL_VOICE_END_REASON_SERVICE_OPTION_NOT_AVAILABLE                            = 112, 
+    QL_VOICE_END_REASON_ACM_LIMIT_EXCEEDED                                      = 113, 
+    QL_VOICE_END_REASON_BEARER_SERVICE_NOT_IMPLEMENTED                          = 114, 
+    QL_VOICE_END_REASON_REQUESTED_FACILITY_NOT_IMPLEMENTED                      = 115, 
+    QL_VOICE_END_REASON_ONLY_DIGITAL_INFORMATION_BEARER_AVAILABLE               = 116, 
+    QL_VOICE_END_REASON_SERVICE_OR_OPTION_NOT_IMPLEMENTED                       = 117, 
+    QL_VOICE_END_REASON_INVALID_TRANSACTION_IDENTIFIER                          = 118, 
+    QL_VOICE_END_REASON_USER_NOT_MEMBER_OF_CUG                                  = 119, 
+    QL_VOICE_END_REASON_INCOMPATIBLE_DESTINATION                                = 120, 
+    QL_VOICE_END_REASON_INVALID_TRANSIT_NW_SELECTION                            = 121, 
+    QL_VOICE_END_REASON_SEMANTICALLY_INCORRECT_MESSAGE                          = 122, 
+    QL_VOICE_END_REASON_INVALID_MANDATORY_INFORMATION                           = 123, 
+    QL_VOICE_END_REASON_MESSAGE_TYPE_NON_IMPLEMENTED                            = 124, 
+    QL_VOICE_END_REASON_MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE         = 125, 
+    QL_VOICE_END_REASON_INFORMATION_ELEMENT_NON_EXISTENT                        = 126, 
+    QL_VOICE_END_REASON_CONDITONAL_IE_ERROR                                     = 127, 
+    QL_VOICE_END_REASON_MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE              = 128, 
+    QL_VOICE_END_REASON_RECOVERY_ON_TIMER_EXPIRED                               = 129, 
+    QL_VOICE_END_REASON_PROTOCOL_ERROR_UNSPECIFIED                              = 130, 
+    QL_VOICE_END_REASON_INTERWORKING_UNSPECIFIED                                = 131, 
+    QL_VOICE_END_REASON_OUTGOING_CALLS_BARRED_WITHIN_CUG                        = 132, 
+    QL_VOICE_END_REASON_NO_CUG_SELECTION                                        = 133, 
+    QL_VOICE_END_REASON_UNKNOWN_CUG_INDEX                                       = 134, 
+    QL_VOICE_END_REASON_CUG_INDEX_INCOMPATIBLE                                  = 135, 
+    QL_VOICE_END_REASON_CUG_CALL_FAILURE_UNSPECIFIED                            = 136, 
+    QL_VOICE_END_REASON_CLIR_NOT_SUBSCRIBED                                     = 137, 
+    QL_VOICE_END_REASON_CCBS_POSSIBLE                                           = 138, 
+    QL_VOICE_END_REASON_CCBS_NOT_POSSIBLE                                       = 139, 
+    QL_VOICE_END_REASON_IMSI_UNKNOWN_IN_HLR                                     = 140, 
+    QL_VOICE_END_REASON_ILLEGAL_MS                                              = 141, 
+    QL_VOICE_END_REASON_IMSI_UNKNOWN_IN_VLR                                     = 142, 
+    QL_VOICE_END_REASON_IMEI_NOT_ACCEPTED                                       = 143, 
+    QL_VOICE_END_REASON_ILLEGAL_ME                                              = 144, 
+    QL_VOICE_END_REASON_PLMN_NOT_ALLOWED                                        = 145, 
+    QL_VOICE_END_REASON_LOCATION_AREA_NOT_ALLOWED                               = 146, 
+    QL_VOICE_END_REASON_ROAMING_NOT_ALLOWED_IN_THIS_LOCATION_AREA               = 147, 
+    QL_VOICE_END_REASON_NO_SUITABLE_CELLS_IN_LOCATION_AREA                      = 148, 
+    QL_VOICE_END_REASON_NETWORK_FAILURE                                         = 149, 
+    QL_VOICE_END_REASON_MAC_FAILURE                                             = 150, 
+    QL_VOICE_END_REASON_SYNCH_FAILURE                                           = 151, 
+    QL_VOICE_END_REASON_NETWORK_CONGESTION                                      = 152, 
+    QL_VOICE_END_REASON_GSM_AUTHENTICATION_UNACCEPTABLE                         = 153, 
+    QL_VOICE_END_REASON_SERVICE_NOT_SUBSCRIBED                                  = 154, 
+    QL_VOICE_END_REASON_SERVICE_TEMPORARILY_OUT_OF_ORDER                        = 155, 
+    QL_VOICE_END_REASON_CALL_CANNOT_BE_IDENTIFIED                               = 156, 
+    QL_VOICE_END_REASON_INCORRECT_SEMANTICS_IN_MESSAGE                          = 157, 
+    QL_VOICE_END_REASON_MANDATORY_INFORMATION_INVALID                           = 158, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_FAILURE                                  = 159, 
+    QL_VOICE_END_REASON_INVALID_SIM                                             = 160, 
+    QL_VOICE_END_REASON_WRONG_STATE                                             = 161, 
+    QL_VOICE_END_REASON_ACCESS_CLASS_BLOCKED                                    = 162, 
+    QL_VOICE_END_REASON_NO_RESOURCES                                            = 163, 
+    QL_VOICE_END_REASON_INVALID_USER_DATA                                       = 164, 
+    QL_VOICE_END_REASON_TIMER_T3230_EXPIRED                                     = 165, 
+    QL_VOICE_END_REASON_NO_CELL_AVAILABLE                                       = 166, 
+    QL_VOICE_END_REASON_ABORT_MSG_RECEIVED                                      = 167, 
+    QL_VOICE_END_REASON_RADIO_LINK_LOST                                         = 168, 
+    QL_VOICE_END_REASON_TIMER_T303_EXPIRED                                      = 169, 
+    QL_VOICE_END_REASON_CNM_MM_REL_PENDING                                      = 170, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_RR_REL_IND                           = 171, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_RR_RANDOM_ACCESS_FAILURE             = 172, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_RRC_REL_IND                          = 173, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_RRC_CLOSE_SESSION_IND                = 174, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_RRC_OPEN_SESSION_FAILURE             = 175, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_LOW_LEVEL_FAIL                       = 176, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_LOW_LEVEL_FAIL_REDIAL_NOT_ALLOWED    = 177, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_LOW_LEVEL_IMMED_RETRY                = 178, 
+    QL_VOICE_END_REASON_ACCESS_STRATUM_REJ_ABORT_RADIO_UNAVAILABLE              = 179, 
+    QL_VOICE_END_REASON_SERVICE_OPTION_NOT_SUPPORTED                            = 180, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_UL_DATA_CNF_FAILURE_TXN                     = 181, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_UL_DATA_CNF_FAILURE_HO                      = 182, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_UL_DATA_CNF_FAILURE_CONN_REL                = 183, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_UL_DATA_CNF_FAILURE_RLF                     = 184, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_UL_DATA_CNF_FAILURE_CTRL_NOT_CONN           = 185, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_SUCCESS                            = 186, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE                            = 187, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_ABORTED                    = 188, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_ACCESS_BARRED              = 189, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_CELL_RESEL                 = 190, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_CONFIG_FAILURE             = 191, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_TIMER_EXPIRED              = 192, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_LINK_FAILURE               = 193, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_NOT_CAMPED                 = 194, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_SI_FAILURE                 = 195, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_EST_FAILURE_CONN_REJECT                = 196, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_NORMAL                             = 197, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_RLF                                = 198, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_CRE_FAILURE                        = 199, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_OOS_DURING_CRE                     = 200, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_ABORTED                            = 201, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_SIB_READ_ERROR                     = 202, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_CONN_REL_ABORTED_IRAT_SUCCESS               = 203, 
+    QL_VOICE_END_REASON_AS_REJ_LRRC_RADIO_LINK_FAILURE                          = 204, 
+    QL_VOICE_END_REASON_AS_REJ_DETACH_WITH_REATTACH_LTE_NW_DETACH               = 205, 
+    QL_VOICE_END_REASON_AS_REJ_DETACH_WITH_OUT_REATTACH_LTE_NW_DETACH           = 206, 
+    QL_VOICE_END_REASON_BAD_REQ_WAIT_INVITE                                     = 207, 
+    QL_VOICE_END_REASON_BAD_REQ_WAIT_REINVITE                                   = 208, 
+    QL_VOICE_END_REASON_INVALID_REMOTE_URI                                      = 209, 
+    QL_VOICE_END_REASON_REMOTE_UNSUPP_MEDIA_TYPE                                = 210, 
+    QL_VOICE_END_REASON_PEER_NOT_REACHABLE                                      = 211, 
+    QL_VOICE_END_REASON_NETWORK_NO_RESP_TIME_OUT                                = 212, 
+    QL_VOICE_END_REASON_NETWORK_NO_RESP_HOLD_FAIL                               = 213, 
+    QL_VOICE_END_REASON_DATA_CONNECTION_LOST                                    = 214, 
+    QL_VOICE_END_REASON_UPGRADE_DOWNGRADE_REJ                                   = 215, 
+    QL_VOICE_END_REASON_SIP_403_FORBIDDEN                                       = 216, 
+    QL_VOICE_END_REASON_NO_NETWORK_RESP                                         = 217, 
+    QL_VOICE_END_REASON_UPGRADE_DOWNGRADE_FAILED                                = 218, 
+    QL_VOICE_END_REASON_UPGRADE_DOWNGRADE_CANCELLED                             = 219, 
+    QL_VOICE_END_REASON_SSAC_REJECT                                             = 220, 
+    QL_VOICE_END_REASON_THERMAL_EMERGENCY                                       = 221, 
+    QL_VOICE_END_REASON_1XCSFB_SOFT_FAILURE                                     = 222, 
+    QL_VOICE_END_REASON_1XCSFB_HARD_FAILURE                                     = 223, 
+    QL_VOICE_END_REASON_CONNECTION_EST_FAILURE                                  = 224, 
+    QL_VOICE_END_REASON_CONNECTION_FAILURE                                      = 225, 
+    QL_VOICE_END_REASON_RRC_CONN_REL_NO_MT_SETUP                                = 226, 
+    QL_VOICE_END_REASON_ESR_FAILURE                                             = 227, 
+    QL_VOICE_END_REASON_MT_CSFB_NO_RESPONSE_FROM_NW                             = 228, 
+    QL_VOICE_END_REASON_BUSY_EVERYWHERE                                         = 229, 
+    QL_VOICE_END_REASON_ANSWERED_ELSEWHERE                                      = 230, 
+    QL_VOICE_END_REASON_RLF_DURING_CC_DISCONNECT                                = 231, 
+    QL_VOICE_END_REASON_TEMP_REDIAL_ALLOWED                                     = 232, 
+    QL_VOICE_END_REASON_PERM_REDIAL_NOT_NEEDED                                  = 233, 
+    QL_VOICE_END_REASON_MERGED_TO_CONFERENCE                                    = 234, 
+    QL_VOICE_END_REASON_LOW_BATTERY                                             = 235, 
+    QL_VOICE_END_REASON_CALL_DEFLECTED                                          = 236, 
+    QL_VOICE_END_REASON_RTP_RTCP_TIMEOUT                                        = 237, 
+    QL_VOICE_END_REASON_RINGING_RINGBACK_TIMEOUT                                = 238, 
+    QL_VOICE_END_REASON_REG_RESTORATION                                         = 239, 
+    QL_VOICE_END_REASON_CODEC_ERROR                                             = 240, 
+    QL_VOICE_END_REASON_UNSUPPORTED_SDP                                         = 241, 
+    QL_VOICE_END_REASON_RTP_FAILURE                                             = 242, 
+    QL_VOICE_END_REASON_QoS_FAILURE                                             = 243, 
+    QL_VOICE_END_REASON_MULTIPLE_CHOICES                                        = 244, 
+    QL_VOICE_END_REASON_MOVED_PERMANENTLY                                       = 245, 
+    QL_VOICE_END_REASON_MOVED_TEMPORARILY                                       = 246, 
+    QL_VOICE_END_REASON_USE_PROXY                                               = 247, 
+    QL_VOICE_END_REASON_ALTERNATE_SERVICE                                       = 248, 
+    QL_VOICE_END_REASON_ALTERNATE_EMERGENCY_CALL                                = 249, 
+    QL_VOICE_END_REASON_UNAUTHORIZED                                            = 250, 
+    QL_VOICE_END_REASON_PAYMENT_REQUIRED                                        = 251, 
+    QL_VOICE_END_REASON_METHOD_NOT_ALLOWED                                      = 252, 
+    QL_VOICE_END_REASON_NOT_ACCEPTABLE                                          = 253, 
+    QL_VOICE_END_REASON_PROXY_AUTHENTICATION_REQUIRED                           = 254, 
+    QL_VOICE_END_REASON_GONE                                                    = 255, 
+    QL_VOICE_END_REASON_REQUEST_ENTITY_TOO_LARGE                                = 256, 
+    QL_VOICE_END_REASON_REQUEST_URI_TOO_LARGE                                   = 257, 
+    QL_VOICE_END_REASON_UNSUPPORTED_URI_SCHEME                                  = 258, 
+    QL_VOICE_END_REASON_BAD_EXTENSION                                           = 259, 
+    QL_VOICE_END_REASON_EXTENSION_REQUIRED                                      = 260, 
+    QL_VOICE_END_REASON_INTERVAL_TOO_BRIEF                                      = 261, 
+    QL_VOICE_END_REASON_CALL_OR_TRANS_DOES_NOT_EXIST                            = 262, 
+    QL_VOICE_END_REASON_LOOP_DETECTED                                           = 263, 
+    QL_VOICE_END_REASON_TOO_MANY_HOPS                                           = 264, 
+    QL_VOICE_END_REASON_ADDRESS_INCOMPLETE                                      = 265, 
+    QL_VOICE_END_REASON_AMBIGUOUS                                               = 266, 
+    QL_VOICE_END_REASON_REQUEST_TERMINATED                                      = 267, 
+    QL_VOICE_END_REASON_NOT_ACCEPTABLE_HERE                                     = 268, 
+    QL_VOICE_END_REASON_REQUEST_PENDING                                         = 269, 
+    QL_VOICE_END_REASON_UNDECIPHERABLE                                          = 270, 
+    QL_VOICE_END_REASON_SERVER_INTERNAL_ERROR                                   = 271, 
+    QL_VOICE_END_REASON_NOT_IMPLEMENTED                                         = 272, 
+    QL_VOICE_END_REASON_BAD_GATEWAY                                             = 273, 
+    QL_VOICE_END_REASON_SERVER_TIME_OUT                                         = 274, 
+    QL_VOICE_END_REASON_VERSION_NOT_SUPPORTED                                   = 275, 
+    QL_VOICE_END_REASON_MESSAGE_TOO_LARGE                                       = 276, 
+    QL_VOICE_END_REASON_DOES_NOT_EXIST_ANYWHERE                                 = 277, 
+    QL_VOICE_END_REASON_SESS_DESCR_NOT_ACCEPTABLE                               = 278, 
+    QL_VOICE_END_REASON_SRVCC_END_CALL                                          = 279, 
+    QL_VOICE_END_REASON_INTERNAL_ERROR                                          = 280, 
+    QL_VOICE_END_REASON_SERVER_UNAVAILABLE                                      = 281, 
+    QL_VOICE_END_REASON_PRECONDITION_FAILURE                                    = 282, 
+    QL_VOICE_END_REASON_DRVCC_IN_PROG                                           = 283, 
+    QL_VOICE_END_REASON_DRVCC_END_CALL                                          = 284, 
+    QL_VOICE_END_REASON_CS_HARD_FAILURE                                         = 285, 
+    QL_VOICE_END_REASON_CS_ACQ_FAILURE                                          = 286, 
+    QL_VOICE_END_REASON_FALLBACK_TO_CS                                          = 287, 
+    QL_VOICE_END_REASON_DEAD_BATTERY                                            = 288, 
+    QL_VOICE_END_REASON_HO_NOT_FEASIBLE                                         = 289, 
+    QL_VOICE_END_REASON_PDN_DISCONNECTED                                        = 290, 
+    QL_VOICE_END_REASON_REJECTED_ELSEWHERE                                      = 291, 
+    QL_VOICE_END_REASON_CALL_PULLED                                             = 292, 
+    QL_VOICE_END_REASON_CALL_PULL_OUT_OF_SYNC                                   = 293, 
+    QL_VOICE_END_REASON_HOLD_RESUME_FAILED                                      = 294, 
+    QL_VOICE_END_REASON_HOLD_RESUME_CANCELED                                    = 295, 
+    QL_VOICE_END_REASON_REINVITE_COLLISION                                      = 296, 
+    QL_VOICE_END_REASON_1XCSFB_MSG_INVAILD                                      = 297, 
+    QL_VOICE_END_REASON_1XCSFB_MSG_IGNORE                                       = 298, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_ACQ_FAIL                                    = 299, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_CALL_REL_REL_ORDER                          = 300, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_CALL_REL_REORDER                            = 301, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_CALL_REL_INTERCEPT_ORDER                    = 302, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_CALL_REL_NORMAL                             = 303, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_CALL_REL_SO_REJ                             = 304, 
+    QL_VOICE_END_REASON_1XCSFB_FAIL_CALL_REL_OTASP_SPC_ERR                      = 305, 
+    QL_VOICE_END_REASON_1XCSFB_FAILURE_SRCH_TT_FAIL                             = 306, 
+    QL_VOICE_END_REASON_1XCSFB_FAILURE_TCH_INIT_FAIL                            = 307, 
+    QL_VOICE_END_REASON_1XCSFB_FAILURE_FAILURE_USER_CALL_END                    = 308, 
+    QL_VOICE_END_REASON_1XCSFB_FAILURE_FAILURE_RETRY_EXHAUST                    = 309, 
+    QL_VOICE_END_REASON_1XCSFB_FAILURE_FAILURE_CALL_REL_REG_REJ                 = 310, 
+    QL_VOICE_END_REASON_1XCSFB_FAILURE_FAILURE_CALL_REL_NW_REL_ODR              = 311, 
+    QL_VOICE_END_REASON_1XCSFB_HO_FAILURE                                       = 312, 
+    QL_VOICE_END_REASON_EMM_REJ_TIMER_T3417_EXT_EXP                             = 313, 
+    QL_VOICE_END_REASON_EMM_REJ_TIMER_T3417_EXP                                 = 314, 
+    QL_VOICE_END_REASON_EMM_REJ_SERVICE_REQ_FAILURE_LTE_NW_REJECT               = 315, 
+    QL_VOICE_END_REASON_EMM_REJ_SERVICE_REQ_FAILURE_CS_DOMAIN_NOT_AVAILABLE     = 316, 
+    QL_VOICE_END_REASON_EMM_REJ                                                 = 317, 
+} QL_VOICE_END_REASON_E;
+
+typedef struct 
+{
+    uint32_t                id;
+    char                    number[QL_VOICE_MAX_PHONE_NUMBER + 1];
+    QL_VOICE_STATE_E        state;
+    QL_VOICE_TECH_E         tech;
+    QL_VOICE_DIR_E          dir;
+    QL_VOICE_END_REASON_E   end_reason;
+} ql_voice_record_t;
+
+typedef struct
+{
+    int len;    /**< length of records */
+    ql_voice_record_t records[QL_VOICE_MAX_RECORDS];
+} ql_voice_record_array_t;
+
+typedef void (*ql_voice_call_cb_f)(ql_voice_record_array_t *p_arr);
+
+typedef enum
+{
+    QL_VOICE_DTMF_EVENT_REV_BURST               = 0x00, /**< Sends a CDMA-burst DTMF \n  */
+    QL_VOICE_DTMF_EVENT_REV_START_CONT          = 0x01, /**< Starts a continuous DTMF tone \n  */
+    QL_VOICE_DTMF_EVENT_REV_STOP_CONT           = 0x02, /**< Stops a continuous DTMF tone \n  */
+    QL_VOICE_DTMF_EVENT_FWD_BURST               = 0x03, /**< Received a CDMA-burst DTMF message \n  */
+    QL_VOICE_DTMF_EVENT_FWD_START_CONT          = 0x04, /**< Received a start-continuous DTMF tone order \n  */
+    QL_VOICE_DTMF_EVENT_FWD_STOP_CONT           = 0x05, /**< Received a stop-continuous DTMF tone order \n  */
+    QL_VOICE_DTMF_EVENT_IP_INCOMING_DTMF_START  = 0x06, /**< Received an IP-start continuous DTMF message \n  */
+    QL_VOICE_DTMF_EVENT_IP_INCOMING_DTMF_STOP   = 0x07, /**< Received an IP-stop continuous DTMF message  */
+} QL_VOICE_DTMF_EVENT_E;
+
+/** voice dtmf event callback */
+typedef void (*ql_voice_dtmf_cb_f)(uint32_t id, QL_VOICE_DTMF_EVENT_E event, 
+                                        char *digits, int len); /**< len: length of digits */
+
+/** forwarding condition */
+typedef enum
+{
+    QL_VOICE__FW_COND_UNCONDITIONALLY = 0, /**<  Unconditional call forwarding. */
+    QL_VOICE__FW_COND_MOBILEBUSY      = 1, /**<  Forward when the mobile device is busy. */
+    QL_VOICE__FW_COND_NOREPLY         = 2, /**<  Forward when there is no reply. */
+    QL_VOICE__FW_COND_UNREACHABLE     = 3, /**<  Forward when the call is unreachable. */
+    QL_VOICE__FW_COND_ALLFORWARDING   = 4, /**<  All forwarding(0-3).*/
+    QL_VOICE__FW_COND_ALLCONDITIONAL  = 5, /**<  All conditional forwarding(1-3). */
+} QL_VOICE_FW_COND_E;
+
+typedef enum
+{
+    QL_VOICE_FW_TYPE_VOICE         = 0, /**<  Forwarding Voice. */
+    QL_VOICE_FW_TYPE_DATA          = 1, /**<  Forwarding Data. */
+    QL_VOICE_FW_TYPE_VOICE_DATA    = 2, /**<  Forwarding voice and data. */
+} QL_VOICE_FW_TYPE_E;
+
+/** */
+typedef enum {
+  QL_VOICE_PRIMARY_SUBSCRIPTION      = 0, 
+  QL_VOICE_SECONDARY_SUBSCRIPTION    = 1, 
+} QL_VOICE_SUBSCRIPTION_E;
+
+typedef struct 
+{
+    int enabled;
+    int len;    /**< length of details  */
+    struct {
+        QL_VOICE_FW_TYPE_E type;
+        char number[QL_VOICE_MAX_PHONE_NUMBER + 1];
+    } details[QL_VOICE_MAX_FW_DETAIL_LENGTH];
+} ql_voice_fw_status_t;
+
+typedef enum
+{
+    QL_VOICE_ECALL_TYPE_TEST        = 1, /**<  Test eCall */
+    QL_VOICE_ECALL_TYPE_EMERGENCY   = 2, /**<  Emergency eCall */
+    QL_VOICE_ECALL_TYPE_RECONFIG    = 3, /**<  Reconfig eCall */
+} QL_VOICE_ECALL_TYPE_E;
+
+typedef struct 
+{
+    uint32_t msd_len;                       /**< Length of Minimum Set of Data */
+    uint8_t msd[QL_VOICE_MAX_ECALL_MSD];    /**< Minimum Set of Data */
+    QL_VOICE_ECALL_TYPE_E type;             /**< eCall type */
+    int auto_trigger;                       /**< 0 - Manually trigger eCall
+                                                 1 - Automatically trigger eCall */
+    char test_number[QL_VOICE_MAX_PHONE_NUMBER]; /**< Test number */
+} ql_voice_ecall_info_t;
+
+/** eCall state */
+typedef enum {
+    QL_VOICE_ECALL_STATE_NONE                   = -1,
+    QL_VOICE_ECALL_STATE_INACTIVE               = 0, 
+    QL_VOICE_ECALL_STATE_ORIGINATING_CALL       = 1, 
+    QL_VOICE_ECALL_STATE_IN_CALL_TRANSMITTING   = 2, /**<  ECALL APP TRANSMITTING */
+    QL_VOICE_ECALL_STATE_WAITING_FOR_AL_ACK     = 3, 
+    QL_VOICE_ECALL_STATE_IN_CALL                = 4, 
+    QL_VOICE_ECALL_STATE_IDLE_ALLOW_MT_ECALL    = 5, 
+} QL_VOICE_ECALL_STATE_E;
+
+/** eCall mode */
+typedef enum {
+    QL_VOICE_ECALL_MODE_NORMAL  = 0, /**< eCall enabled normal mode. */
+    QL_VOICE_ECALL_MODE_ONLY    = 1, /**< eCall-only mode. */
+    QL_VOICE_ECALL_MODE_DEFAULT = 2,
+} QL_VOICE_ECALL_MODE_E;
+
+/** eCall configuration */
+typedef struct 
+{
+    uint8_t enable;                 /**<  Enable or disable ecall: 0 -- Disable; 1 -- Enable */
+    uint8_t voice_mute;             /**<  Enable or disable to mute IVS speaker in MSD
+                                          0 - Disable to mute IVS speaker automatical in MSD transmission
+                                          1 - Enable to mute IVS speaker automatical in MSD transmission */
+    QL_VOICE_ECALL_MODE_E mode;     /**<  The Ecall mode. */
+    uint8_t report_event;           /**<  Enable or disable to report ecall event info.   
+                                          0 - Disable; 
+                                          1 - Enable */
+    uint16_t start_timer;           /**<  The timer of IVS waiting for "START". T5 */
+    uint16_t hack_timer;            /**<  The timer of IVS waiting for "HACK". T6 */
+    uint16_t trans_timer;           /**<  The timer of MSD transmission. T7 */
+    uint8_t fail_redial;            /**<  The dial fail times. */
+    uint8_t drop_redial;            /**<  The ecall abnormal disconnenct redial times. */
+    uint16_t cleardown_timer;       /**<  The timer of IVS waiting for "ClearDown". T2 */
+    uint16_t init_timer;            /**<  The timer of IVS waiting for "InitIATION". T3 */
+    uint16_t nad_reg_timer;         /**<  The timer of IVS waiting for "NAD Registration". T9*/
+    uint16_t nad_dereg_timer;       /**<  The timer of IVS waiting for "NAD Deregistration". T10*/
+    uint8_t standard;               /**<  The ecall system standard.
+                                          0 - EU; 
+                                          1 - ERA_GLONASS */
+    uint16_t era_glonass_redial;    /**<  The timer of era glonass redial times.*/
+    uint16_t auto_answer;           /**<  The timer of AUTO ANSWER times.*/
+} ql_voice_ecall_config_t;
+
+/** eCall config items */
+typedef enum
+{
+    QL_VOICE_ECALL_CONFIG_ENABLE                = (1 << 0),
+    QL_VOICE_ECALL_CONFIG_VOICE_MUTE            = (1 << 1),
+    QL_VOICE_ECALL_CONFIG_MODE                  = (1 << 2),
+    QL_VOICE_ECALL_CONFIG_REPORT_EVENT          = (1 << 3),
+    QL_VOICE_ECALL_CONFIG_START_TIMER           = (1 << 4),
+    QL_VOICE_ECALL_CONFIG_HACK_TIMER            = (1 << 5),
+    QL_VOICE_ECALL_CONFIG_TRANS_TIMER           = (1 << 6),
+    QL_VOICE_ECALL_CONFIG_FAIL_REDIAL           = (1 << 7),
+    QL_VOICE_ECALL_CONFIG_DROP_REDIAL           = (1 << 8),
+    QL_VOICE_ECALL_CONFIG_CLEARDOWN_TIMER       = (1 << 9),
+    QL_VOICE_ECALL_CONFIG_INIT_TIMER            = (1 << 10),
+    QL_VOICE_ECALL_CONFIG_NAD_REG_TIMER         = (1 << 11),
+    QL_VOICE_ECALL_CONFIG_NAD_DEREG_TIMER       = (1 << 12),
+    QL_VOICE_ECALL_CONFIG_STANDARD              = (1 << 13),
+    QL_VOICE_ECALL_CONFIG_ERA_GLONASS_REDIAL    = (1 << 14),
+    QL_VOICE_ECALL_CONFIG_AUTO_ANSWER           = (1 << 15),
+} QL_VOICE_ECALL_CONFIG_E;
+
+/** eCall MSD transmission status */
+typedef enum {
+    QL_VOICE_ECALL_MSD_TRANS_STATUS_NONE      = -1, /**< NONE */
+    QL_VOICE_ECALL_MSD_TRANS_STATUS_SUCCESS   = 0,  /**< Success */
+    QL_VOICE_ECALL_MSD_TRANS_STATUS_FAILURE   = 1,  /**< Generic failure */
+} QL_VOICE_ECALL_MSD_TRANS_STATUS_E;
+
+typedef void (*ql_voice_ecall_status_cb_f)(uint32_t id, 
+                                                   QL_VOICE_ECALL_MSD_TRANS_STATUS_E status);
+
+typedef enum {
+    QL_VOICE_ECALL_EVENT_FAIL_NONE                          = 0, 
+    /**< NONE*/
+    QL_VOICE_ECALL_EVENT_FAIL_TIMEOUT                       = 1, 
+    /**<  Wait for START timeout. */
+    QL_VOICE_ECALL_EVENT_FAIL_HACK_TIMEOUT                  = 2, 
+    /**<  Wait for HACK timeout. */
+    QL_VOICE_ECALL_EVENT_FAIL_MSD_TRANS_TIMEOUT             = 3, 
+    /**<  MSD transmission timeout. */
+    QL_VOICE_ECALL_EVENT_FAIL_IVS_RESET_TIMEOUT             = 4, 
+    /**<  IVS reset. */
+    QL_VOICE_ECALL_EVENT_FAIL_CLEAR_DOWN_FALLBACK_TIMEOUT   = 5, 
+    /**<  clear down fallback timeout. */
+    QL_VOICE_ECALL_EVENT_FAIL_IVS_INITIATION_TIMEOUT        = 6, 
+    /**<  IVS initiation timeout. */
+} QL_VOICE_ECALL_EVENT_FAIL_E;
+
+typedef enum {
+    QL_VOICE_ECALL_EVENT_PROCESS_IVS_NONE = 0, 
+    /**< NONE*/
+    QL_VOICE_ECALL_EVENT_PROCESS_IVS_START_RECEIVED_MSD = 1,
+    /**<  IVS Link Layer receives START message and starts to send MSD */
+    QL_VOICE_ECALL_EVENT_PROCESS_IVS_NACK_RECEIVED = 2, 
+    /**<  IVS Link Layer receives NACK message. */
+    QL_VOICE_ECALL_EVENT_PROCESS_IVS_ACK_RECEIVED = 3, 
+    /**<  IVS Link Layer receives the first LACK message. */
+    QL_VOICE_ECALL_EVENT_PROCESS_IVS_TX_COMPLETED = 4, 
+    /**<  IVS MSD transmission is complete. */
+    QL_VOICE_ECALL_EVENT_PROCESS_IVS_HLACK_RECEIVED = 5, 
+    /**<  IVS Link Layer receives first HACK message. */
+} QL_VOICE_ECALL_EVENT_PROCESS_E;
+
+typedef enum {
+    QL_VOICE_ECALL_EVENT_MSDUPADTE_NONE                     = -1, 
+    /**< NONE */
+    QL_VOICE_ECALL_EVENT_MSDUPDATE_IVS_UPDATING_MSD         = 0, 
+    /**<  Indicates MSD has been updated. */
+    QL_VOICE_ECALL_EVENT_MSDUPDATE_PSAP_REQURE_UPDATE_MSD   = 1, 
+    /**<  Indicate to update MSD in 5 seconds. */
+    QL_VOICE_ECALL_EVENT_MSDUPDATE_IVS_UPDATE_MSD_TIMEOUT   = 2, 
+    /**<  Indicate timeout of updating MSD and module starts to transfer the old MSD. */
+} QL_VOICE_ECALL_EVENT_MSDUPDATE_E;
+
+typedef enum {
+    QL_VOICE_ECALL_EVENT_ESTABLISH_NONE = -1, 
+    /**< NONE */
+    QL_VOICE_ECALL_EVENT_ESTABLISH_SUCCESS = 0,
+    /**<  Establish eCall successfully. */
+    QL_VOICE_ECALL_EVENT_ESTABLISH_FAIL = 1, 
+    /**<  Establish eCall fails. */
+} QL_VOICE_ECALL_EVENT_ESTABLISH_E;
+
+typedef struct {
+    uint8_t ori_remainder_times;
+    /**< Originate fail remainder times*/
+
+    uint16_t time;
+    /**< The minimum time duration between the previous call attempt */
+} ql_voice_ecall_event_originate_fail_redial_t;  /* Type */
+
+typedef struct {
+    uint8_t drop_remainder_times;
+    /**< Dorp remainder times*/
+
+    uint16_t time;
+    /**< The minimum time duration between the previous call attempt */
+} ql_voice_ecall_event_drop_redial_t;  /* Type */
+
+typedef enum {
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_NONE                  = -1, 
+    /**< NONE*/
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_START_RECV_SYN        = 0, 
+    /**<  eCall start recevied synchronization. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_T9_TIMEOUT            = 1, 
+    /**<  eCall T9 TIMEOUT. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_T10_TIMEOUT           = 2,
+    /**<  eCall T10 TIMEOUT. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_IVS_ALACK_RECEIVED    = 3, 
+    /**<  IVS receives ALACK message. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_IVS_LLACK_RECEIVED    = 4, 
+    /**<  IVS receives LLACK message. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_STOPPED               = 5, 
+    /**<  IVS receives STOPPED message. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_ANSWERING_INCOMING_PSAP_ECALL = 6, 
+    /**<  IVS AUTO ANSWERING INCOMING PSAP ECALL. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_CLEARDOWN_RECEIVED    = 7, 
+    /**<  IVS receives CLEARDOWN message. */
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_CALLBACK_TIMEOUT      = 8, 
+    /**<  eCall CALLBACK TIMEOUT. */
+    QL_VOICE_ECALL_EVENT_IVS_NORMAL_CLEARING                = 9,
+    /**<  eCall IVS NORAML CLEATING. */
+    QL_VOICE_ECALL_EVENT_IVS_ABNORMAL_CLEARING              = 10,
+    /**<  eCall IVS ABNORAML CLEATING. */
+} QL_VOICE_ECALL_EVENT_EXTEND_STATE_E;
+
+/** eCall event */
+typedef struct
+{
+    QL_VOICE_ECALL_EVENT_FAIL_E fail;
+    /**< Event of eCall Failed.*/
+    QL_VOICE_ECALL_EVENT_PROCESS_E process;
+    /**< Event of eCall process.*/
+    QL_VOICE_ECALL_EVENT_MSDUPDATE_E msdupdate;
+    /**< Event of ecall msd update.*/
+    QL_VOICE_ECALL_EVENT_ESTABLISH_E establish;
+    /**< Event of eCall establish.*/
+    uint16_t hack_code;
+    /**< Event of eCall hack code.*/
+    ql_voice_ecall_event_originate_fail_redial_t ori_redial;
+    /**< Event of originate fail and redial.*/
+    ql_voice_ecall_event_drop_redial_t drop_redial;
+    /**< Event of drop and redial.*/
+    QL_VOICE_ECALL_EVENT_EXTEND_STATE_E extend_state;
+    /**< Event of eCall other state.*/
+} ql_voice_ecall_event_t;
+
+typedef void (*ql_voice_ecall_event_cb_f)(ql_voice_ecall_event_t *p_event);
+
+typedef void (*ql_voice_service_error_cb_f)(int error);
+
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Initializes voice service.
+  @return Whether the voice service was initialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_init(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Deinitializes voice service.
+  @return Whether the voice service was deinitialized successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_deinit(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Dials a call.
+  @param[in] num    phone number to dial.
+  @param[in] len    length of phone number, should be less than 
+                    or euqnal to QL_VOICE_MAX_PHONE_NUMBER.
+  @param[out] id    call id.
+  @return Whether a voice call was successfully dialed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_dial(char *num, int len, uint32_t *id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Cancels dialing with given id.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully cancelled.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_cancel_dial(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  hangup all dialing.
+  @return Whether all voice call were successfully hangup.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_hangup_all(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Answers the call.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully answered.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_answer(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Hangs up the call.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully hung up.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_hangup(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Holds the call when mutil calls is activated.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully held.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_hold(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Releases the call from hold when mutil calls is activated.
+  @param[in] id call id returned from dial.
+  @return Whether the voice call was successfully unheld.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_unhold(uint32_t id);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets call records.
+  @param[in] p_arr  pointer to ql_voice_record_array_t.
+  @return Whether the call records were successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_get_records(ql_voice_record_array_t *p_arr);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Registers or Unregisters forwarding.
+  @param[in] reg    0 - unregister, 1 - register.
+  @param[in] cond   forwarding condition.
+  @param[in] num    phone number.
+  @param[in] len    length of phone numebr.
+  @return Whether the voice call forward was registered or unregistered successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_forwarding(int reg, QL_VOICE_FW_COND_E cond, char *num, int len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets forwarding status.
+  @param[in]  cond      forwarding condition.
+  @param[out] p_status  pointer to ql_voice_fw_status_t.
+  @return Whether the voice call forward status was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_get_forwarding_status(QL_VOICE_FW_COND_E cond, ql_voice_fw_status_t *p_status);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Enables or disables call waiting.
+  @param[in] enable 0 - disable, other - enable.
+  @return Whether the voice call waiting was enabled or disabled successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_waiting(int enable);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets call waiting status.
+  @param[out] enabled 0 - waiting is disabled, 1 - waiting is enabled.
+  @return Whether the voice call waiting status was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_get_waiting_status(int *enabled);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Enables or disables auto answer.
+  @param[in] enable 0 - disable, other - enable.
+  @param[in] sec    wait this `sec' seconds before auto answer.
+  @return Whether the voice call autoanswer was enabled or disabled successfully.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_autoanswer(int enable, uint32_t sec);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sends a DTMF(Dual Tone Multi Frequency) character over the call ID.
+  @param[in] id call id returned from dial.
+  @param[in] c DTMF character to be sent. Valid DTMF characters are 0-9, A-D, '*', '#'.
+  @return Whether a DTMF character was successfully sent.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_send_dtmf_char(uint32_t id, char c);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets voice call callback handler.
+  @param[in] cb call back handler.
+  @return Whether the voice call callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_set_call_cb(ql_voice_call_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets voice dtmf callback handler.
+  @param[in] cb call back handler.
+  @return Whether the voice call DTMF repcetion callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_set_dtmf_cb(ql_voice_dtmf_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Dials eCall.
+  @param[in] p_info eCall info.
+  @return Whether a eCall was successfully dialed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_dial(ql_voice_ecall_info_t *p_info);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Hangs up eCall.
+  @return Whether the eCall was successfully hung up.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_hangup(void);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Updates eCall MSD.
+  @param[in] msd Minimum Set of Data.
+  @param[in] msd_len Length of Minimum Set of Data.
+  @return Whether the eCall MSD was successfully updated.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_update_msd(const uint8_t *msd, uint32_t msd_len);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Pushes eCall MSD.
+  @param[out] state eCall state.
+  @return Whether the eCall MSD was successfully pushed.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_push_msd(QL_VOICE_ECALL_STATE_E *state);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Gets eCall config.
+  @param[in] p_config eCall config.
+  @return Whether the eCall config was successfully obtained.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_get_config(ql_voice_ecall_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets eCall config.
+  @param[in] item Items to set.
+  @param[in] p_config eCall config.
+  @return Whether the eCall config was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_set_config(int item, ql_voice_ecall_config_t *p_config);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets eCall event callback handler.
+  @param[in] cb call back handler.
+  @return Whether the eCall event callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_set_event_cb(ql_voice_ecall_event_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Sets eCall status callback handler.
+  @param[in] cb call back handler.
+  @return Whether the eCall status callback handler was successfully set.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_ecall_set_status_cb(ql_voice_ecall_status_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/**
+  @brief  Registration server error callback. Currently, only if the server exits abnormally, 
+  the callback function will be executed, and the error code is QL_ERR_ABORTED;
+  @param[in] cb  Callback function 
+  @return
+  QL_ERR_OK - successful
+  Other - error code defined by ql_type.h
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_set_service_error_cb(ql_voice_service_error_cb_f cb);
+
+/*-----------------------------------------------------------------------------------------------*/
+/** 
+  @brief  Binds the current control point to a specific subscription.
+  @param[in] sub  Subscription type.
+  @return Whether the subscription was successfully bound.
+  @retval QL_ERR_OK successful.
+  @retval QL_ERR_INVALID_ARG invalid argument.
+  @retval QL_ERR_UNKNOWN unknown error, failed to connect to service.
+  @retval QL_ERR_SERVICE_NOT_READY service is not ready, need to retry.
+  @retval Other error code defined by ql_type.h.
+  */
+/*-----------------------------------------------------------------------------------------------*/
+int ql_voice_bind_subscription(QL_VOICE_SUBSCRIPTION_E sub);
+