blob: 1d70b0aa16368ea21c5224eb2ded0fce5109cce8 [file] [log] [blame]
/*****************************************************************************
* 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:
* ---------
* sbp_utility.c
*
* Project:
* --------
* MOLY
*
* Description:
* ------------
* This file is intends for SBP definition
*
* Author:
* -------
* -------
*
*============================================================================
****************************************************************************/
#define SBP_UTILITY_C
#include "kal_general_types.h"
#include "sbp_public_utility.h"
#include "kal_public_api.h"
#include "ps_em_enum.h"
#include "nvram_interface.h"
#include "nvram_data_items.h"
#include "sbp_nvram_def.h"
#include "nvram_enums.h"
#include "nvram_editor_data_item.h"
#include "sim_ps_api.h"
#include "md_sap.h"
#include "custom_imc_config.h"
#include "custom_ltecsr_config.h"
#include "mcf_if.h"
#include "sbp_trc.h"
#include "kal_trace.h"
#if defined (__TC01_NVRAM__) || defined(__TC01__) //MOLY00294741
/*MUSE - ALPS0144925 */ /*MOLY00294741*/
/*Customer's specific Single Binary Platform (SBP) features */
nvram_ef_sbp_modem_config_struct cust_sbp_config;
#endif
#define SBP_TEST_MODE_VAL_1 8286
#define SBP_TEST_MODE_VAL_2 8287
extern sim_interface_enum l4c_gemini_get_actual_sim_id(sim_interface_enum simId);
extern ps_conf_test_mode_enum query_ps_conf_test_mode(void);
extern kal_uint8 ValCurrentActiveSimIndex();
void sbp_get_sbp_ids_from_cntxt(nvram_ef_sbp_ids_struct *sbp_ids_ptr);
typedef struct
{
kal_uint32 sbp_id;
kal_uint32 sbp_sub_id;
kal_uint32 test_mode;
kal_uint32 dsbp_mode;
nvram_ef_sbp_dsbp_config_struct dsbp_config;
} sbp_common_context_struct;
typedef struct
{
kal_uint32 current_sim_sbp_id;
kal_uint32 dsbp_sim_sbp_id_mode1; // IMS/VoLTE
kal_uint32 dsbp_sim_sbp_id_mode2; // All modem
kal_uint8 modem_sbp_config[(SBP_MAX_MD_FEATURE/8)+1]; //the size depends on SBP_MAX_MD_FEATURE
#if defined (__TC01_NVRAM__) || defined(__TC01__) // __TC01_CUST_SBP__
kal_uint8 modem_cust_sbp_config[(SBP_CUSTOM_MAX_MD_FEATURE/8)+1]; //the size depends on SBP_MAX_CUST_MD_FEATURE
#endif
kal_uint8 modem_sbp_data_config[SBP_DATA_MAX_MD_FEATURE];
kal_uint8 mcc[MAX_MCC_STR_LEN];
kal_uint8 mnc[MAX_MNC_STR_LEN];
kal_uint8 iccid[21];
} sbp_context_struct;
#ifdef __IPC_ADAPTER__
#include "ipca_nvram_def.h"
sbp_salecode_struct sbp_salecode;
#endif
kal_uint32 default_sbp_id = SBP_ID_INVALID;
kal_uint32 default_sbp_sub_id = 0;
nvram_ef_sbp_modem_config_struct sbp_config;
nvram_ef_sbp_modem_data_config_struct sbp_data_config;
nvram_ef_sbp_custom_sbp_id_mapping_struct g_custom_sbp_id_mapping_table;
nvram_ef_sbp_mdcxp_sbp_id_list_struct g_mdcxp_sbp_id_list;
static sbp_common_context_struct sbp_common_cntxt_g;
static sbp_context_struct sbp_cntxt_g[MAX_SIM_NUM];
/*****************************************************************************
* FUNCTION
* sbp_get_dsbp_mode
*
* DESCRIPTION
* query dynamic SBP mode
*
* PARAMETERS
* [IN] N/A
* RETURNS
* current DSBP mode : l4bsbp_dsbp_mode_enum
*****************************************************************************/
kal_uint8 sbp_get_dsbp_mode (void)
{
return (kal_uint8) sbp_common_cntxt_g.dsbp_mode;
}
/*****************************************************************************
* FUNCTION
* sbp_set_dsbp_mode
*
* DESCRIPTION
* Set dynamic SBP mode.
*
* PARAMETERS
* dsbp_mdoe [IN] l4bsbp_dsbp_mode_enum
* RETURNS
* KAL_TRUE : success
* KAL_FALSE : fail
*****************************************************************************/
kal_bool sbp_set_dsbp_mode (kal_uint8 dspb_mode)
{
kal_bool result = KAL_TRUE;
#ifdef __IPC_ADAPTER__
nvram_ef_sbp_dsbp_info_struct dsbp_info_buf;
result = nvram_external_read_data(NVRAM_EF_SBP_DSBP_INFO_LID,
1,
(kal_uint8*) &dsbp_info_buf,
NVRAM_EF_SBP_DSBP_INFO_SIZE);
if (result == KAL_TRUE)
{
sbp_common_cntxt_g.dsbp_mode = (kal_uint32) dspb_mode;
dsbp_info_buf.default_dsbp_mode = dspb_mode;
result = nvram_external_write_data(NVRAM_EF_SBP_DSBP_INFO_LID,
1,
(kal_uint8*) &dsbp_info_buf,
NVRAM_EF_SBP_DSBP_INFO_SIZE);
}
#else
nvram_ef_sbp_ids_struct sbp_id_buf;
sbp_common_cntxt_g.dsbp_mode = (kal_uint32) dspb_mode;
// fill LID info from current context
sbp_get_sbp_ids_from_cntxt(&sbp_id_buf);
result = nvram_external_write_data(NVRAM_EF_SBP_IDS_LID,
1,
(kal_uint8*) &sbp_id_buf,
NVRAM_EF_SBP_IDS_SIZE);
#endif
return result;
}
/*****************************************************************************
* FUNCTION
* sbp_get_test_mode
*
* DESCRIPTION
* query if it is under test mode or not
*
* PARAMETERS
* [IN] N/A
* RETURNS
* current SBP test mode : sbp_test_mode_enum
*****************************************************************************/
sbp_test_mode_enum sbp_get_test_mode (void)
{
if (sbp_common_cntxt_g.test_mode == SBP_TEST_MODE_VAL_1)
return SBP_TEST_MODE_1;
else if (sbp_common_cntxt_g.test_mode == SBP_TEST_MODE_VAL_2)
return SBP_TEST_MODE_2;
else
return SBP_TEST_MODE_NONE;
}
/*****************************************************************************
* FUNCTION
* sbp_set_test_mode
*
* DESCRIPTION
* Set SBP to test mode.
* In test mode, we read current values of nvram files instead of using default values before applying SBP settings.
*
* PARAMETERS
* test_mdoe [IN] sbp_test_mode_enum
* RETURNS
* KAL_TRUE : success
* KAL_FALSE : fail
*****************************************************************************/
kal_bool sbp_set_test_mode (sbp_test_mode_enum test_mode)
{
nvram_ef_sbp_ids_struct sbp_id_buf;
kal_bool result = KAL_TRUE;
if (test_mode == SBP_TEST_MODE_NONE)
sbp_common_cntxt_g.test_mode = 0;
else if (test_mode == SBP_TEST_MODE_1)
sbp_common_cntxt_g.test_mode = SBP_TEST_MODE_VAL_1;
else if (test_mode == SBP_TEST_MODE_2)
sbp_common_cntxt_g.test_mode = SBP_TEST_MODE_VAL_2;
// fill LID info from current context
sbp_get_sbp_ids_from_cntxt(&sbp_id_buf);
result = nvram_external_write_data(NVRAM_EF_SBP_IDS_LID,
1,
(kal_uint8*) &sbp_id_buf,
NVRAM_EF_SBP_IDS_SIZE);
return result;
}
/*****************************************************************************
* FUNCTION
* sbp_query_md_feature()
*
* DESCRIPTION
* This function is used to query modem configuration
*
* PARAMETERS
* feature [IN] modem feature
*
* RETURNS
* KAL_TRUE : if this feature is turned on
* KAL_FALSE : if this feature is turned off
*****************************************************************************/
kal_bool sbp_query_md_feature(sbp_md_feature_enum feature)
{
return sbp_query_md_feature_by_ps(feature, PROTOCOL_1);
}
#ifdef __CDMA2000_RAT__
/*****************************************************************************
* FUNCTION
* sbp_query_md_feature_for_c2k()
*
* DESCRIPTION
* This function is used to query modem configuration and used by C2K team only
* The function will judge current active PS using C2K's API and return the corresponding setting.
*
* PARAMETERS
* feature [IN] modem feature
*
* RETURNS
* KAL_TRUE : if this feature is turned on
* KAL_FALSE : if this feature is turned off
*****************************************************************************/
kal_bool sbp_query_md_feature_for_c2k(sbp_md_feature_enum feature)
{
protocol_id_enum ps_id = ValCurrentActiveSimIndex();
if (ps_id >= MAX_SIM_NUM)
{
#ifndef __L1_STANDALONE__
MD_TRC_ERROR_SBP_INVALID_PS_ID(ps_id);
#endif
return KAL_FALSE;
}
return sbp_query_md_feature_by_ps(feature, ps_id);
}
#endif
/*****************************************************************************
* FUNCTION
* sbp_query_md_feature_by_ps()
*
* DESCRIPTION
* This function is used to query modem configuration according to the PS ID
*
* PARAMETERS
* feature [IN] modem feature
* ps_id [IN] PS ID
*
* RETURNS
* KAL_TRUE : if this feature is turned on
* KAL_FALSE : if this feature is turned off
*****************************************************************************/
kal_bool sbp_query_md_feature_by_ps(sbp_md_feature_enum feature, protocol_id_enum ps_id)
{
kal_uint8 *bitmask_ptr;
kal_uint32 byte_offset;
kal_uint8 bit_offset;
kal_bool result;
#ifndef __L1_STANDALONE__
static sbp_md_feature_enum latest_queried_sbp[MAX_SIM_NUM];
#endif
if (feature >= SBP_MAX_MD_FEATURE)
{
DEBUG_ASSERT(0);
return KAL_FALSE;
}
if (ps_id >=MAX_SIM_NUM)
{
#ifndef __L1_STANDALONE__
MD_TRC_ERROR_SBP_INVALID_PS_ID(ps_id);
#endif
return KAL_FALSE;
}
byte_offset = feature / 8;
bit_offset = feature % 8;
bitmask_ptr = &(sbp_cntxt_g[ps_id].modem_sbp_config[byte_offset]);
result = (((*bitmask_ptr) & (0x01 << bit_offset)) != 0)? KAL_TRUE : KAL_FALSE;
//For GCF or other test modes, you may overwrite the result.
result = sbp_md_feature_overwrite(feature, result);
#ifndef __L1_STANDALONE__
if (latest_queried_sbp[ps_id] != feature)
{
MD_TRC_INFO_SBP_FEATURE(ps_id, feature, result);
latest_queried_sbp[ps_id] = feature;
}
#endif
return result;
}
/*****************************************************************************
* FUNCTION
* sbp_query_md_feature_no_overwrite()
*
* DESCRIPTION
* This function is used to query modem configuration without overwrite
*
* PARAMETERS
* feature [IN] modem feature
*
* RETURNS
* KAL_TRUE : if this feature is turned on
* KAL_FALSE : if this feature is turned off
*****************************************************************************/
kal_bool sbp_query_md_feature_no_overwrite(sbp_md_feature_enum feature)
{
return sbp_query_md_feature_no_overwrite_by_ps(feature, PROTOCOL_1);
}
/*****************************************************************************
* FUNCTION
* sbp_query_md_feature_no_overwrite_by_ps()
*
* DESCRIPTION
* This function is used to query modem configuration without overwrite according to the PS ID
*
* PARAMETERS
* feature [IN] modem feature
* ps_id [IN] PS ID
*
* RETURNS
* KAL_TRUE : if this feature is turned on
* KAL_FALSE : if this feature is turned off
*****************************************************************************/
kal_bool sbp_query_md_feature_no_overwrite_by_ps(sbp_md_feature_enum feature, protocol_id_enum ps_id)
{
kal_uint8 *bitmask_ptr;
kal_uint32 byte_offset;
kal_uint8 bit_offset;
kal_bool result;
#ifndef __L1_STANDALONE__
static sbp_md_feature_enum latest_queried_sbp[MAX_SIM_NUM];
#endif
if (feature >= SBP_MAX_MD_FEATURE)
{
DEBUG_ASSERT(0);
return KAL_FALSE;
}
if (ps_id >=MAX_SIM_NUM)
{
#ifndef __L1_STANDALONE__
MD_TRC_ERROR_SBP_INVALID_PS_ID(ps_id);
#endif
return KAL_FALSE;
}
byte_offset = feature / 8;
bit_offset = feature % 8;
bitmask_ptr = &(sbp_cntxt_g[ps_id].modem_sbp_config[byte_offset]);
result = (((*bitmask_ptr) & (0x01 << bit_offset)) != 0)? KAL_TRUE : KAL_FALSE;
#ifndef __L1_STANDALONE__
if (latest_queried_sbp[ps_id] != feature)
{
MD_TRC_INFO_SBP_FEATURE(ps_id, feature, result);
latest_queried_sbp[ps_id] = feature;
}
#endif
return result;
}
/*****************************************************************************
* FUNCTION
* sbp_set_md_feature()
*
* DESCRIPTION
* This function is used to set modem configuration
*
* PARAMETERS
* feature [IN] modem feature
* is_turned_on [IN]
* sbp_feature_ptr [IN/OUT]
*
* RETURNS
* KAL_TRUE if success; otherwise KAL_FALSE
*****************************************************************************/
kal_bool sbp_set_md_feature(sbp_md_feature_enum feature,
kal_bool is_turned_on,
nvram_ef_sbp_modem_config_struct *sbp_feature_ptr)
{
kal_uint8 *bitmask_ptr;
kal_uint32 byte_offset;
kal_uint8 bit_offset;
if (feature >= SBP_MAX_MD_FEATURE)
{
return KAL_FALSE;
}
else
{
byte_offset = feature / 8;
bit_offset = feature % 8;
bitmask_ptr = &(sbp_feature_ptr->modem_sbp_config[byte_offset]);
if (is_turned_on == KAL_TRUE)
{
*bitmask_ptr = ((*bitmask_ptr) | (0x01 << bit_offset));
}
else
{
*bitmask_ptr = ((*bitmask_ptr) & ~(0x01 << bit_offset));
}
}
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_set_md_feature_by_ps()
*
* DESCRIPTION
* This function is used to set modem configuration by PS
* Please don't use this API if you don't get the permission from SBP FPM.
*
* PARAMETERS
* feature [IN] modem feature
* is_turned_on [IN]
* sbp_feature_ptr [IN/OUT]
*
* RETURNS
* KAL_TRUE if success; otherwise KAL_FALSE
*****************************************************************************/
kal_bool sbp_set_md_feature_by_ps(sbp_md_feature_enum feature,
kal_bool is_turned_on,
protocol_id_enum ps_id)
{
kal_uint8 *bitmask_ptr;
kal_uint32 byte_offset;
kal_uint8 bit_offset;
if (feature >= SBP_MAX_MD_FEATURE)
{
return KAL_FALSE;
}
else
{
byte_offset = feature / 8;
bit_offset = feature % 8;
bitmask_ptr = &(sbp_cntxt_g[ps_id].modem_sbp_config[byte_offset]);
if (is_turned_on == KAL_TRUE)
{
*bitmask_ptr = ((*bitmask_ptr) | (0x01 << bit_offset));
}
else
{
*bitmask_ptr = ((*bitmask_ptr) & ~(0x01 << bit_offset));
}
#ifndef __L1_STANDALONE__
MD_TRC_INFO_SBP_SET_FEATURE(ps_id, feature, is_turned_on);
#endif
}
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_general_set_md_feature()
*
* DESCRIPTION
* This function is used to set modem configuration.
* Please don't use this API if you don't get the permission from SBP FPM.
*
* PARAMETERS
* feature [IN] modem feature
* is_turned_on [IN]
*
* RETURNS
* KAL_TRUE if success; otherwise KAL_FALSE
*****************************************************************************/
kal_bool sbp_general_set_md_feature(sbp_md_feature_enum feature, kal_bool is_turned_on)
{
kal_uint8 i;
if (feature >= SBP_MAX_MD_FEATURE)
{
return KAL_FALSE;
}
else
{
for (i=0; i<MAX_SIM_NUM; i++)
sbp_set_md_feature_by_ps( feature, is_turned_on, i);
}
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_query_md_feature_data()
*
* DESCRIPTION
* This function is used to query modem configuration data
*
* PARAMETERS
* feature [IN] modem feature
*
* RETURNS
* the unsigned byte value for the feature
*****************************************************************************/
kal_uint8 sbp_query_md_feature_data(sbp_md_feature_data_enum feature)
{
return sbp_query_md_feature_data_by_ps(feature, PROTOCOL_1);
}
#ifdef __CDMA2000_RAT__
/*****************************************************************************
* FUNCTION
* sbp_query_md_feature_data_for_c2k()
*
* DESCRIPTION
* This function is used to query modem configuration and used by C2K team only
* The function will judge current active PS using C2K's API and return the corresponding setting.
*
* PARAMETERS
* feature [IN] modem feature
*
* RETURNS
* the unsigned byte value for the feature
*****************************************************************************/
kal_uint8 sbp_query_md_feature_data_for_c2k(sbp_md_feature_data_enum feature)
{
protocol_id_enum ps_id = ValCurrentActiveSimIndex();
if (ps_id >= MAX_SIM_NUM)
{
#ifndef __L1_STANDALONE__
MD_TRC_ERROR_SBP_INVALID_PS_ID(ps_id);
#endif
return 0;
}
return sbp_query_md_feature_data_by_ps(feature, ps_id);
}
#endif
/*****************************************************************************
* FUNCTION
* sbp_query_md_feature_data_by_ps()
*
* DESCRIPTION
* This function is used to query modem configuration data
*
* PARAMETERS
* feature [IN] modem feature
* ps_id [IN] PS ID
*
* RETURNS
* the unsigned byte value for the feature
*****************************************************************************/
kal_uint8 sbp_query_md_feature_data_by_ps(sbp_md_feature_data_enum feature, protocol_id_enum ps_id)
{
kal_uint8 result;
#ifndef __L1_STANDALONE__
static sbp_md_feature_data_enum latest_queried_sbp[MAX_SIM_NUM];
#endif
if (feature >= SBP_DATA_MAX_MD_FEATURE)
{
DEBUG_ASSERT(0);
return 0;
}
if (ps_id >=MAX_SIM_NUM)
{
#ifndef __L1_STANDALONE__
MD_TRC_ERROR_SBP_INVALID_PS_ID(ps_id);
#endif
return 0;
}
result = sbp_cntxt_g[ps_id].modem_sbp_data_config[feature];
//For GCF or other test modes, you may overwrite the result.
result = sbp_md_feature_data_overwrite(feature, result);
#ifndef __L1_STANDALONE__
if (latest_queried_sbp[ps_id] != feature)
{
MD_TRC_INFO_SBP_DATA(ps_id, feature, result);
latest_queried_sbp[ps_id] = feature;
}
#endif
return result;
}
/*****************************************************************************
* FUNCTION
* sbp_query_md_feature_data_no_overwrite()
*
* DESCRIPTION
* This function is used to query modem configuration data without overwrite
*
* PARAMETERS
* feature [IN] modem feature
*
* RETURNS
* the unsigned byte value for the feature
*****************************************************************************/
kal_uint8 sbp_query_md_feature_data_no_overwrite(sbp_md_feature_data_enum feature)
{
return sbp_query_md_feature_data_no_overwrite_by_ps(feature, PROTOCOL_1);
}
/*****************************************************************************
* FUNCTION
* sbp_query_md_feature_data_no_overwrite_by_ps()
*
* DESCRIPTION
* This function is used to query modem configuration data without overwrite
*
* PARAMETERS
* feature [IN] modem feature
* ps_id [IN] PS ID
*
* RETURNS
* the unsigned byte value for the feature
*****************************************************************************/
kal_uint8 sbp_query_md_feature_data_no_overwrite_by_ps(sbp_md_feature_data_enum feature, protocol_id_enum ps_id)
{
kal_uint8 result;
#ifndef __L1_STANDALONE__
static sbp_md_feature_data_enum latest_queried_sbp[MAX_SIM_NUM];
#endif
if (feature >= SBP_DATA_MAX_MD_FEATURE)
{
DEBUG_ASSERT(0);
return 0;
}
if (ps_id >=MAX_SIM_NUM)
{
#ifndef __L1_STANDALONE__
MD_TRC_ERROR_SBP_INVALID_PS_ID(ps_id);
#endif
return 0;
}
result = sbp_cntxt_g[ps_id].modem_sbp_data_config[feature];
#ifndef __L1_STANDALONE__
if (latest_queried_sbp[ps_id] != feature)
{
MD_TRC_INFO_SBP_DATA(ps_id, feature, result);
latest_queried_sbp[ps_id] = feature;
}
#endif
return result;
}
/*****************************************************************************
* FUNCTION
* sbp_set_md_feature_data()
*
* DESCRIPTION
* This function is used to set modem configuration data
*
* PARAMETERS
* feature [IN] modem feature
*
* RETURNS
* the unsigned byte value for the feature
*****************************************************************************/
kal_bool sbp_set_md_feature_data(sbp_md_feature_data_enum feature,
kal_uint8 data,
nvram_ef_sbp_modem_data_config_struct *sbp_data_ptr)
{
if (feature >= SBP_DATA_MAX_MD_FEATURE)
{
return KAL_FALSE;
}
else
{
sbp_data_ptr->modem_sbp_data_config[feature] = data;
}
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_set_md_feature_data_by_ps()
*
* DESCRIPTION
* This function is used to set modem configuration data by PS
* Please don't use this API if you don't get the permission from SBP FPM.
*
* PARAMETERS
* feature [IN] modem feature
*
* RETURNS
* the unsigned byte value for the feature
*****************************************************************************/
kal_bool sbp_set_md_feature_data_by_ps(sbp_md_feature_data_enum feature,
kal_uint8 data,
protocol_id_enum ps_id)
{
if (feature >= SBP_DATA_MAX_MD_FEATURE)
{
return KAL_FALSE;
}
else
{
sbp_cntxt_g[ps_id].modem_sbp_data_config[feature]= data;
#ifndef __L1_STANDALONE__
MD_TRC_INFO_SBP_SET_DATA(ps_id, feature, data);
#endif
}
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_general_set_md_feature_data()
*
* DESCRIPTION
* This function is used to set modem configuration data
* Please don't use this API if you don't get the permission from SBP FPM.
*
* PARAMETERS
* feature [IN] modem feature
*
* RETURNS
* the unsigned byte value for the feature
*****************************************************************************/
kal_bool sbp_general_set_md_feature_data(sbp_md_feature_data_enum feature, kal_uint8 data)
{
kal_uint8 i;
if (feature >= SBP_DATA_MAX_MD_FEATURE)
{
return KAL_FALSE;
}
else
{
for (i=0; i< MAX_SIM_NUM; i++)
sbp_set_md_feature_data_by_ps(feature, data, i);
}
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_query_id()
*
* DESCRIPTION
* This function is used to query SBP ID received by modem
*
* PARAMETERS
* [IN] N/A
*
* RETURNS
* the unsigned 4-byte value for the SBP ID
*****************************************************************************/
kal_uint32 sbp_query_id(void)
{
return sbp_common_cntxt_g.sbp_id;
}
/*****************************************************************************
* FUNCTION
* sbp_query_sub_id()
*
* DESCRIPTION
* This function is used to query SBP Sub ID received by modem
*
* PARAMETERS
* [IN] N/A
* RETURNS
* the unsigned 4-byte value for the SBP Sub ID
*****************************************************************************/
kal_uint32 sbp_query_sub_id(void)
{
return sbp_common_cntxt_g.sbp_sub_id;
}
/*****************************************************************************
* FUNCTION
* sbp_get_sbp_ids_from_cntxt
*
* DESCRIPTION
* This function is used to get NVRAM_EF_SBP_IDS_LID information from current context
*
* PARAMETERS
* param [IN] sbp_ids_ptr
* RETURNS
* void
*
*****************************************************************************/
void sbp_get_sbp_ids_from_cntxt(nvram_ef_sbp_ids_struct *sbp_ids_ptr)
{
kal_uint8 i;
sbp_ids_ptr->sbp_id = sbp_common_cntxt_g.sbp_id;
sbp_ids_ptr->test_mode = sbp_common_cntxt_g.test_mode;
sbp_ids_ptr->dsbp_mode = sbp_common_cntxt_g.dsbp_mode;
for (i=0; i<MAX_SIM_NUM; i++)
{
sbp_ids_ptr->sim_sbp_id_info[i].sim_sbp_id = sbp_cntxt_g[i].dsbp_sim_sbp_id_mode2;
kal_mem_cpy(sbp_ids_ptr->sim_sbp_id_info[i].mcc, sbp_cntxt_g[i].mcc , MAX_MCC_STR_LEN);
kal_mem_cpy(sbp_ids_ptr->sim_sbp_id_info[i].mnc, sbp_cntxt_g[i].mnc, MAX_MNC_STR_LEN);
kal_mem_cpy(sbp_ids_ptr->sim_sbp_id_info[i].iccid, sbp_cntxt_g[i].iccid, 21);
}
}
/*****************************************************************************
* FUNCTION
* sbp_init_contexts()
*
* DESCRIPTION
* This function is used to init SBP Contexts
*
* PARAMETERS
* [IN] N/A
*
* RETURNS
* KAL_TRUE or KAL_FALSE
*****************************************************************************/
kal_bool sbp_init_contexts()
{
kal_uint8 i;
nvram_ef_sbp_ids_struct sbp_id_buf;
nvram_ef_sbp_dsbp_config_struct dsbp_config_buf;
#ifdef __IPC_ADAPTER__
nvram_ipc_factory_common_struct ipc_nvram_buf;
nvram_ef_sbp_dsbp_info_struct dsbp_info_buf;
kal_bool result;
#endif
nvram_external_read_data(NVRAM_EF_SBP_DSBP_CONFIG_LID,
1,
(kal_uint8*)&dsbp_config_buf,
NVRAM_EF_SBP_DSBP_CONFIG_SIZE);
nvram_external_read_data(NVRAM_EF_SBP_IDS_LID,
1,
(kal_uint8*)&sbp_id_buf,
NVRAM_EF_SBP_IDS_SIZE);
nvram_external_read_data(NVRAM_EF_SBP_CUSTOM_SBP_ID_MAPPING_LID,
1,
(kal_uint8*)&g_custom_sbp_id_mapping_table,
NVRAM_EF_SBP_CUSTOM_SBP_ID_MAPPING_SIZE);
nvram_external_read_data(NVRAM_EF_SBP_MDCXP_SBP_ID_LIST_LID,
1,
(kal_uint8*)&g_mdcxp_sbp_id_list,
NVRAM_EF_SBP_MDCXP_SBP_ID_LIST_SIZE);
// prepare SBP Context
sbp_common_cntxt_g.sbp_id = sbp_id_buf.sbp_id;
sbp_common_cntxt_g.sbp_sub_id= 0;
sbp_common_cntxt_g.test_mode = sbp_id_buf.test_mode;
sbp_common_cntxt_g.dsbp_mode = sbp_id_buf.dsbp_mode;
kal_mem_cpy(&sbp_common_cntxt_g.dsbp_config, &dsbp_config_buf, NVRAM_EF_SBP_DSBP_CONFIG_SIZE);
for (i=0; i<MAX_SIM_NUM; i++)
{
sbp_cntxt_g[i].current_sim_sbp_id = SBP_ID_INVALID;
sbp_cntxt_g[i].dsbp_sim_sbp_id_mode1 = SBP_ID_INVALID;
sbp_cntxt_g[i].dsbp_sim_sbp_id_mode2 = sbp_id_buf.sim_sbp_id_info[i].sim_sbp_id;
kal_mem_cpy(sbp_cntxt_g[i].mcc, sbp_id_buf.sim_sbp_id_info[i].mcc, MAX_MCC_STR_LEN);
kal_mem_cpy(sbp_cntxt_g[i].mnc, sbp_id_buf.sim_sbp_id_info[i].mnc, MAX_MNC_STR_LEN);
kal_mem_cpy(sbp_cntxt_g[i].iccid, sbp_id_buf.sim_sbp_id_info[i].iccid, 21);
}
if (default_sbp_id == SBP_ID_INVALID)
default_sbp_id = sbp_id_buf.sbp_id;
#ifdef __IPC_ADAPTER__
nvram_external_read_data(NVRAM_EF_IPC_FACTORY_COMMON_LID,
1,
(kal_uint8*) &ipc_nvram_buf,
NVRAM_EF_IPC_FACTORY_COMMON_SIZE);
memcpy( (void *) sbp_salecode.csc_salecode, (void *) &ipc_nvram_buf.sellout_product_code[11], 3);
memcpy( (void *) sbp_salecode.network_code, (void *) ipc_nvram_buf.network_code, 3); // For SIM Slot 0
memcpy( (void *) sbp_salecode.network_code_2, (void *) ipc_nvram_buf.network_code_2, 3); // For SIM Slot 1
result = nvram_external_read_data(NVRAM_EF_SBP_DSBP_INFO_LID,
1,
(kal_uint8*) &dsbp_info_buf,
NVRAM_EF_SBP_DSBP_INFO_SIZE);
if (result == KAL_TRUE &&
dsbp_info_buf.default_dsbp_mode <= 2)
{
sbp_common_cntxt_g.dsbp_mode = dsbp_info_buf.default_dsbp_mode;
}
#endif
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_module_clean
*
* DESCRIPTION
* This function cleans up user sensative informatino for SBP
*
* PARAMETERS
* [IN] N/A
* RETURNS
* void
*
*****************************************************************************/
void sbp_module_clean(void)
{
kal_uint8 i;
for (i=0; i<MAX_SIM_NUM; i++)
{
kal_mem_set(sbp_cntxt_g[i].iccid, 0, 21);
}
}
/*****************************************************************************
* FUNCTION
* sbp_set_sbp_id()
*
* DESCRIPTION
* This function is used to set SBP ID into SBP contexts and its NVRAM
* Please don't use this API if you don't get the permission from SBP FPM.
*
* PARAMETERS
* [IN] N/A
*
* RETURNS
* KAL_TRUE or KAL_FALSE
*****************************************************************************/
kal_bool sbp_set_sbp_id(kal_uint32 sbp_id)
{
nvram_ef_sbp_ids_struct sbp_id_buf;
sbp_common_cntxt_g.sbp_id = sbp_id;
// Currently, SBP sub ID in the conext will be always the same with default SBP Sub ID form CCCI.
sbp_common_cntxt_g.sbp_sub_id = default_sbp_sub_id;
// fill LID info from current context
sbp_get_sbp_ids_from_cntxt(&sbp_id_buf);
nvram_external_write_data(NVRAM_EF_SBP_IDS_LID,
1,
(kal_uint8*)&sbp_id_buf,
NVRAM_EF_SBP_IDS_SIZE);
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_convert_mcc_mnc_string_from_imsi
* DESCRIPTION
* get mcc, mnc from imsi with string format
* PARAMETERS
* imsi
* RETURNS
* KAL_TRUE
*****************************************************************************/
kal_bool sbp_convert_mcc_mnc_string_from_imsi(kal_uint8* mcc_ptr, kal_uint32 mcc_size, kal_uint8 *mnc_ptr, kal_uint32 mnc_size, kal_uint8* imsi_ptr, kal_uint8 mnc_len)
{
if (!mcc_ptr || !mnc_ptr || !imsi_ptr)
{
return KAL_FALSE;
}
if ((mcc_size < MAX_MCC_STR_LEN) || (mnc_size < MAX_MNC_STR_LEN ))
{
return KAL_FALSE;
}
if ((mnc_len != 2) && (mnc_len != 3))
{
return KAL_FALSE;
}
/* get mcc/mnc and convert to ASCII */
mcc_ptr[0] = (imsi_ptr[0] >> 4) + 48; //mcc1
mcc_ptr[1] = (imsi_ptr[1] & 0x0F) + 48; //mcc2
mcc_ptr[2] = (imsi_ptr[1] >> 4) + 48; //mcc3
mcc_ptr[3] = 0;
mnc_ptr[0] = (imsi_ptr[2] & 0x0F) + 48; //mnc1
mnc_ptr[1] = (imsi_ptr[2] >> 4) + 48; //mnc2
if (mnc_len == 3)
{
mnc_ptr[2] = (imsi_ptr[3] & 0x0F) + 48; //mnc3
}
mnc_ptr[mnc_len] = 0;
mnc_ptr[3] = 0;
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_get_sim_sbp_id_for_all()
*
* DESCRIPTION
* get SIM SBP ID which trigger DSBP for all modem (IMS/VoLTE + PS/L1)
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* the unsigned 4-byte value for the SIM SBP ID
*
*****************************************************************************/
kal_uint32 sbp_get_sim_sbp_id_for_all(protocol_id_enum ps_id)
{
return sbp_cntxt_g[ps_id].dsbp_sim_sbp_id_mode2;
}
/*****************************************************************************
* FUNCTION
* sbp_get_current_sim_sbp_id()
*
* DESCRIPTION
* get SIM SBP ID which trigger DSBP for IMS/VoLTE
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* the unsigned 4-byte value for the SIM SBP ID
*
*****************************************************************************/
kal_uint32 sbp_get_current_sim_sbp_id(protocol_id_enum ps_id)
{
return sbp_cntxt_g[ps_id].current_sim_sbp_id;
}
/*****************************************************************************
* FUNCTION
* sbp_get_sim_sbp_id()
*
* DESCRIPTION
* get SIM SBP ID which trigger DSBP for IMS/VoLTE
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* the unsigned 4-byte value for the SIM SBP ID
*
*****************************************************************************/
kal_uint32 sbp_get_sim_sbp_id(protocol_id_enum ps_id)
{
return sbp_cntxt_g[ps_id].dsbp_sim_sbp_id_mode1;
}
/*****************************************************************************
* FUNCTION
* sbp_set_sim_sbp_id_for_all()
*
* DESCRIPTION
* set SIM SBP ID which trigger DSBP for all modem (IMS/VoLTE + PS/L1)
*
* PARAMETERS
* ps_id [IN] protocol ID
* sim_sbp_id [IN] SIM SBP ID
* mcc [IN] MCC
* mnc [IN] MNC
* iccid [IN] ICCID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
kal_bool sbp_set_sim_sbp_id_for_all(protocol_id_enum ps_id, kal_uint32 sim_sbp_id, kal_uint8 *mcc, kal_uint8 *mnc, kal_uint8 *iccid)
{
nvram_ef_sbp_ids_struct *nvram_ef_sbp_ids_ptr;
kal_bool result = KAL_FALSE;
nvram_ef_sbp_ids_ptr = (nvram_ef_sbp_ids_struct *) get_ctrl_buffer(sizeof(nvram_ef_sbp_ids_struct));
if (nvram_ef_sbp_ids_ptr == NULL)
{
return KAL_FALSE;
}
sbp_cntxt_g[ps_id].dsbp_sim_sbp_id_mode2 = sim_sbp_id;
// read VDM ims_reconfig_enable setting first
/* to use ps_id instead of l4c_gemini_get_actual_sim_id(ps_id),
SIM SBP ID NVRAM LID is combined with protocol stack, not SIM slot
*/
// fill LID info from current context
sbp_get_sbp_ids_from_cntxt(nvram_ef_sbp_ids_ptr);
// update LID info with new sim_sbp_id_info
nvram_ef_sbp_ids_ptr->sim_sbp_id_info[ps_id].sim_sbp_id = sim_sbp_id;
// For mode2, update both sbp context and NVRAM after DSBP completion
if (mcc == NULL)
{
kal_mem_set(nvram_ef_sbp_ids_ptr->sim_sbp_id_info[ps_id].mcc, 0, MAX_MCC_STR_LEN);
kal_mem_set(sbp_cntxt_g[ps_id].mcc, 0, MAX_MCC_STR_LEN);
}
else
{
kal_mem_cpy(nvram_ef_sbp_ids_ptr->sim_sbp_id_info[ps_id].mcc, mcc, MAX_MCC_STR_LEN);
kal_mem_cpy(sbp_cntxt_g[ps_id].mcc, mcc, MAX_MCC_STR_LEN);
}
if (mnc == NULL)
{
kal_mem_set(nvram_ef_sbp_ids_ptr->sim_sbp_id_info[ps_id].mnc, 0, MAX_MNC_STR_LEN);
kal_mem_set(sbp_cntxt_g[ps_id].mnc, 0, MAX_MNC_STR_LEN);
}
else
{
kal_mem_cpy(nvram_ef_sbp_ids_ptr->sim_sbp_id_info[ps_id].mnc, mnc, MAX_MNC_STR_LEN);
kal_mem_cpy(sbp_cntxt_g[ps_id].mnc, mnc, MAX_MNC_STR_LEN);
}
if (iccid == NULL)
{
kal_mem_set(nvram_ef_sbp_ids_ptr->sim_sbp_id_info[ps_id].iccid, 0, 21);
kal_mem_set(sbp_cntxt_g[ps_id].iccid, 0, 21);
}
else
{
kal_mem_cpy(nvram_ef_sbp_ids_ptr->sim_sbp_id_info[ps_id].iccid, iccid, 21);
kal_mem_cpy(sbp_cntxt_g[ps_id].iccid, iccid, 21);
}
result = nvram_external_write_data(NVRAM_EF_SBP_IDS_LID,
1,
(kal_uint8*)nvram_ef_sbp_ids_ptr,
NVRAM_EF_SBP_IDS_SIZE);
// Free allocated buffer
free_ctrl_buffer(nvram_ef_sbp_ids_ptr);
return result;
}
/*****************************************************************************
* FUNCTION
* sbp_set_current_sim_sbp_id()
*
* DESCRIPTION
* set SIM SBP ID for current PS
*
* PARAMETERS
* ps_id [IN] protocol ID
* sim_sbp_id [IN] SIM SBP ID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
kal_bool sbp_set_current_sim_sbp_id(protocol_id_enum ps_id, kal_uint32 sim_sbp_id)
{
sbp_cntxt_g[ps_id].current_sim_sbp_id = sim_sbp_id;
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_set_sim_sbp_id()
*
* DESCRIPTION
* set SIM SBP ID which trigger DSBP for IMS/VoLTE
*
* PARAMETERS
* ps_id [IN] protocol ID
* sim_sbp_id [IN] SIM SBP ID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
kal_bool sbp_set_sim_sbp_id(protocol_id_enum ps_id, kal_uint32 sim_sbp_id, kal_uint8 *mcc, kal_uint8 *mnc, kal_uint8 *iccid)
{
// For mode1, update sbp context after DSBP completion
// (but not update NVRAM, mode1 info does not persist after pwr cycle)
sbp_cntxt_g[ps_id].dsbp_sim_sbp_id_mode1 = sim_sbp_id;
if (mcc == NULL)
kal_mem_set(sbp_cntxt_g[ps_id].mcc, 0, MAX_MCC_STR_LEN);
else
kal_mem_cpy(sbp_cntxt_g[ps_id].mcc, mcc, MAX_MCC_STR_LEN);
if (mnc == NULL)
kal_mem_set(sbp_cntxt_g[ps_id].mnc, 0, MAX_MNC_STR_LEN);
else
kal_mem_cpy(sbp_cntxt_g[ps_id].mnc, mnc, MAX_MNC_STR_LEN);
if (iccid == NULL)
kal_mem_set(sbp_cntxt_g[ps_id].iccid, 0, 21);
else
kal_mem_cpy(sbp_cntxt_g[ps_id].iccid, iccid, 21);
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_get_sbp_feature_raw_config()
*
* DESCRIPTION
* Get SBP Feature Raw Data according to the ps_id
* Please don't use this API if you don't get the permission from SBP FPM.
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
kal_bool sbp_get_sbp_feature_raw_config(protocol_id_enum ps_id, kal_uint8 *raw_config)
{
kal_mem_cpy(raw_config, sbp_cntxt_g[ps_id].modem_sbp_config, (SBP_MAX_MD_FEATURE/8)+1);
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_set_sbp_feature_raw_config()
*
* DESCRIPTION
* Set SBP Feature Raw Data according to the ps_id
* Please don't use this API if you don't get the permission from SBP FPM.
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
void sbp_set_sbp_feature_raw_config(protocol_id_enum ps_id, kal_uint8 *raw_config)
{
kal_mem_cpy(sbp_cntxt_g[ps_id].modem_sbp_config, raw_config, (SBP_MAX_MD_FEATURE/8)+1);
}
/*****************************************************************************
* FUNCTION
* sbp_get_sbp_data_raw_config()
*
* DESCRIPTION
* Get SBP Data Raw Data according to the ps_id
* Please don't use this API if you don't get the permission from SBP FPM.
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
kal_bool sbp_get_sbp_data_raw_config(protocol_id_enum ps_id, kal_uint8 *raw_config)
{
kal_mem_cpy(raw_config, sbp_cntxt_g[ps_id].modem_sbp_data_config, SBP_DATA_MAX_MD_FEATURE);
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_set_sbp_data_raw_config()
*
* DESCRIPTION
* Get SBP Data Raw Data according to the ps_id
* Please don't use this API if you don't get the permission from SBP FPM.
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
void sbp_set_sbp_data_raw_config(protocol_id_enum ps_id, kal_uint8 *raw_config)
{
kal_mem_cpy(sbp_cntxt_g[ps_id].modem_sbp_data_config, raw_config, SBP_DATA_MAX_MD_FEATURE);
}
/*****************************************************************************
* FUNCTION
* sbp_update_features_to_nvram()
*
* DESCRIPTION
* This function is used to store current config of features from SBP contexts into NVRAM_EF_SBP_MODEM_CONFIG_LID
* Please don't use this API if you don't get the permission from SBP FPM.
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
kal_bool sbp_update_features_to_nvram()
{
nvram_ef_sbp_modem_config_struct sbp_local_config;
sbp_local_config.sbp_mode = SBP_ID_INVALID;
kal_mem_cpy(sbp_local_config.modem_sbp_config, sbp_cntxt_g[SIM1].modem_sbp_config, (SBP_MAX_MD_FEATURE/8)+1);
nvram_external_write_data(NVRAM_EF_SBP_MODEM_CONFIG_LID,
1,
(kal_uint8*)&sbp_local_config,
NVRAM_EF_SBP_MODEM_CONFIG_SIZE);
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_update_data_to_nvram()
*
* DESCRIPTION
* This function is used to store current config of data from SBP contexts into NVRAM_EF_SBP_MODEM_DATA_CONFIG_LID
* Please don't use this API if you don't get the permission from SBP FPM.
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
kal_bool sbp_update_data_to_nvram()
{
nvram_ef_sbp_modem_data_config_struct sbp_local_config;
sbp_local_config.sbp_mode = SBP_ID_INVALID;
kal_mem_cpy(sbp_local_config.modem_sbp_data_config, sbp_cntxt_g[SIM1].modem_sbp_data_config, SBP_DATA_MAX_MD_FEATURE);
nvram_external_write_data(NVRAM_EF_SBP_MODEM_DATA_CONFIG_LID,
1,
(kal_uint8*)&sbp_local_config,
NVRAM_EF_SBP_MODEM_DATA_CONFIG_SIZE);
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_update_specific_feature_to_nvram()
*
* DESCRIPTION
* This function is used to write a single SBP feature to NVRAM, keeping all other features the same
*
* PARAMETERS
* feature [IN] modem feature
* is_turned_on [IN]
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
kal_bool sbp_update_specific_feature_to_nvram(sbp_md_feature_enum feature, kal_bool is_turned_on)
{
nvram_ef_sbp_modem_config_struct sbp_local_config;
nvram_external_read_data(NVRAM_EF_SBP_MODEM_CONFIG_LID,
1,
(kal_uint8*)&sbp_local_config,
NVRAM_EF_SBP_MODEM_CONFIG_SIZE);
sbp_set_md_feature(feature, is_turned_on, (nvram_ef_sbp_modem_config_struct*)&sbp_local_config);
nvram_external_write_data(NVRAM_EF_SBP_MODEM_CONFIG_LID,
1,
(kal_uint8*)&sbp_local_config,
NVRAM_EF_SBP_MODEM_CONFIG_SIZE);
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_update_specific_data_to_nvram()
*
* DESCRIPTION
* This function is used to write a single SBP feature data to NVRAM, keeping all other feature data the same
*
* PARAMETERS
* feature [IN] modem feature data
* data [IN] value of feature data
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
kal_bool sbp_update_specific_data_to_nvram(sbp_md_feature_data_enum feature, kal_uint8 data)
{
nvram_ef_sbp_modem_data_config_struct sbp_local_config;
nvram_external_read_data(NVRAM_EF_SBP_MODEM_DATA_CONFIG_LID,
1,
(kal_uint8*)&sbp_local_config,
NVRAM_EF_SBP_MODEM_DATA_CONFIG_SIZE);
sbp_set_md_feature_data(feature, data, (nvram_ef_sbp_modem_data_config_struct*)&sbp_local_config);
nvram_external_write_data(NVRAM_EF_SBP_MODEM_DATA_CONFIG_LID,
1,
(kal_uint8*)&sbp_local_config,
NVRAM_EF_SBP_MODEM_DATA_CONFIG_SIZE);
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_reload_config()
*
* DESCRIPTION
* This function is used to reload SBP related feature/data configuration
* Please don't use this API if you don't get the permission from SBP FPM.
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
void sbp_reload_config()
{
kal_bool result;
kal_uint8 i;
nvram_ef_sbp_modem_config_struct sbp_feature_buf;
nvram_ef_sbp_modem_data_config_struct sbp_data_buf;
#if defined (__TC01_NVRAM__) || defined(__TC01__) // __TC01_CUST_SBP__
nvram_ef_sbp_modem_config_struct sbp_cust_feature_buf;
#endif
/* load SBP file */
result = nvram_external_read_data(NVRAM_EF_SBP_MODEM_CONFIG_LID,
1,
(kal_uint8*)&sbp_feature_buf,
NVRAM_EF_SBP_MODEM_CONFIG_SIZE);
if (result == KAL_TRUE)
{
for (i=0; i<MAX_SIM_NUM; i++)
{
kal_mem_cpy(&sbp_cntxt_g[i].modem_sbp_config, sbp_feature_buf.modem_sbp_config, (SBP_MAX_MD_FEATURE/8)+1);
}
}
else
{
kal_sys_trace("Reload SBP features settings from NVRAM fail");
}
result = nvram_external_read_data(NVRAM_EF_SBP_MODEM_DATA_CONFIG_LID,
1,
(kal_uint8*)&sbp_data_buf,
NVRAM_EF_SBP_MODEM_DATA_CONFIG_SIZE);
if (result == KAL_TRUE)
{
for (i=0; i<MAX_SIM_NUM; i++)
{
kal_mem_cpy(&sbp_cntxt_g[i].modem_sbp_data_config, sbp_data_buf.modem_sbp_data_config, SBP_DATA_MAX_MD_FEATURE);
}
}
else
{
kal_sys_trace("Reload SBP data settings from NVRAM fail");
}
#if defined (__TC01_NVRAM__) || defined(__TC01__) // __TC01_CUST_SBP__
result = nvram_external_read_data(NVRAM_EF_SBP_MODEM_CONFIG_LID,
NVRAM_CUST_SBP_IDX,
(kal_uint8*)&sbp_cust_feature_buf,
NVRAM_EF_SBP_MODEM_CONFIG_SIZE);
if (result == KAL_TRUE)
{
for (i=0; i<MAX_SIM_NUM; i++)
{
kal_mem_cpy(&sbp_cntxt_g[i].modem_cust_sbp_config, sbp_cust_feature_buf.modem_sbp_config, (SBP_CUSTOM_MAX_MD_FEATURE/8)+1);
}
}
else
{
kal_sys_trace("Reload Custom SBP features settings from NVRAM fail");
}
#endif
}
/*****************************************************************************
* FUNCTION
* sbp_get_reconfig_param()
*
* DESCRIPTION
* This function is used to get MCC/MNC/ICCID information, which is used to compute SIM SBP ID
* from SBP contexts
* Please don't use this API if there is no permission from SBP FW owner
*
* PARAMETERS
* ps_id [IN] protocol ID
* param [IN] sbp_reconfig_custom_param_struct
* RETURNS
* void
*
*****************************************************************************/
void sbp_get_reconfig_param(protocol_id_enum ps_id, sbp_reconfig_custom_param_struct *param)
{
kal_mem_cpy(param->mcc, sbp_cntxt_g[ps_id].mcc, MAX_MCC_STR_LEN);
kal_mem_cpy(param->mnc, sbp_cntxt_g[ps_id].mnc, MAX_MNC_STR_LEN);
kal_mem_cpy(param->iccid, sbp_cntxt_g[ps_id].iccid, 21);
}
/*****************************************************************************
* FUNCTION
* sbp_get_last_dsbp_sim_info()
*
* DESCRIPTION
* This function is used to get MCC/MNC/ICCID of last completed DSBP
* For mode2 device, this will include SIM info from last power up
* For mode1 device, only include SIM info in current sbp context
*
* PARAMETERS
* ps_id [IN] protocol ID
* param [IN] mcc, mnc, iccid
* RETURNS
* void
*
*****************************************************************************/
void sbp_get_last_dsbp_sim_info(protocol_id_enum ps_id, kal_uint8 *mcc, kal_uint8 *mnc, kal_uint8 *iccid)
{
kal_mem_cpy(mcc, sbp_cntxt_g[ps_id].mcc, MAX_MCC_STR_LEN);
kal_mem_cpy(mnc, sbp_cntxt_g[ps_id].mnc, MAX_MNC_STR_LEN);
kal_mem_cpy(iccid, sbp_cntxt_g[ps_id].iccid, 21);
MD_TRC_INFO_SBP_LAST_DSBP_SIM_INFO(ps_id, sbp_cntxt_g[ps_id].mcc, sbp_cntxt_g[ps_id].mnc);
}
/*****************************************************************************
* FUNCTION
* sbp_get_last_mode2_dsbp_sim_info()
*
* DESCRIPTION
* This function is used to get SIM_SBP_ID/MCC/MNC/ICCID of last completed mode2 DSBP
* Can be used in DSBP callback function to compare with last mode2 DSBP result
* As part of mode2 design, this includes info from SIM insert of last power cycle
*
* PARAMETERS
* ps_id [IN] protocol ID
* param [IN] sim_sbp_id, mcc, mnc, iccid
* RETURNS
* void
*
*****************************************************************************/
void sbp_get_last_mode2_dsbp_sim_info(protocol_id_enum ps_id, kal_uint32 *sim_sbp_id, kal_uint8 *mcc, kal_uint8 *mnc, kal_uint8 *iccid)
{
*sim_sbp_id = sbp_cntxt_g[ps_id].dsbp_sim_sbp_id_mode2;
kal_mem_cpy(mcc, sbp_cntxt_g[ps_id].mcc, MAX_MCC_STR_LEN);
kal_mem_cpy(mnc, sbp_cntxt_g[ps_id].mnc, MAX_MNC_STR_LEN);
kal_mem_cpy(iccid, sbp_cntxt_g[ps_id].iccid, 21);
}
/*****************************************************************************
* FUNCTION
* sbp_update_custom_config_to_nvram
*
* DESCRIPTION
* This function updates sbp feature/data custom config to nvram
*
* PARAMETERS
* ps_id [IN] protocol ID
* is_erase [IN] reset the feature/data item or not
* RETURNS
* void
*
*****************************************************************************/
kal_bool sbp_update_custom_config_to_nvram(sbp_custom_config_struct *sbp_custom_config_ptr, kal_bool is_erase)
{
kal_bool result = KAL_FALSE;
nvram_ef_sbp_custom_modem_config_struct *sbp_custom_modem_config_nv_ptr;
sbp_custom_config_struct *sbp_custom_config_nv_ptr;
kal_uint32 i = 0;
sbp_custom_modem_config_nv_ptr = (nvram_ef_sbp_custom_modem_config_struct *) get_ctrl_buffer(
sizeof(nvram_ef_sbp_custom_modem_config_struct));
if (sbp_custom_modem_config_nv_ptr == NULL)
{
return KAL_FALSE;
}
result = nvram_external_read_data(NVRAM_EF_SBP_CUSTOM_MODEM_CONFIG_LID,
1,
(kal_uint8*)sbp_custom_modem_config_nv_ptr,
NVRAM_EF_SBP_CUSTOM_MODEM_CONFIG_SIZE);
if (result == KAL_TRUE)
{
// Erase any duplicate entry
for (i = 0; i < SBP_MAX_CUSTOM_CONFIG; i++)
{
sbp_custom_config_nv_ptr = &sbp_custom_modem_config_nv_ptr->sbp_custom_config[i];
if (sbp_custom_config_nv_ptr->sbp_id == sbp_custom_config_ptr->sbp_id &&
sbp_custom_config_nv_ptr->sbp_cust_cfg_type == sbp_custom_config_ptr->sbp_cust_cfg_type &&
sbp_custom_config_nv_ptr->sbp_cust_cfg_feature == sbp_custom_config_ptr->sbp_cust_cfg_feature)
{
sbp_custom_config_nv_ptr->sbp_id = 0;
sbp_custom_config_nv_ptr->sbp_cust_cfg_type = 0;
sbp_custom_config_nv_ptr->sbp_cust_cfg_feature = 0;
sbp_custom_config_nv_ptr->sbp_cust_cfg_feature_val = 0;
}
}
// For update, find empty index so we can update to nvram
if (is_erase == KAL_FALSE)
{
for (i = 0; i < SBP_MAX_CUSTOM_CONFIG; i++)
{
sbp_custom_config_nv_ptr = &sbp_custom_modem_config_nv_ptr->sbp_custom_config[i];
if (sbp_custom_config_nv_ptr->sbp_id == 0 &&
sbp_custom_config_nv_ptr->sbp_cust_cfg_type == 0 &&
sbp_custom_config_nv_ptr->sbp_cust_cfg_feature == 0 &&
sbp_custom_config_nv_ptr->sbp_cust_cfg_feature_val == 0)
{
sbp_custom_config_nv_ptr->sbp_id = sbp_custom_config_ptr->sbp_id;
sbp_custom_config_nv_ptr->sbp_cust_cfg_type = sbp_custom_config_ptr->sbp_cust_cfg_type;
sbp_custom_config_nv_ptr->sbp_cust_cfg_feature = sbp_custom_config_ptr->sbp_cust_cfg_feature;
sbp_custom_config_nv_ptr->sbp_cust_cfg_feature_val = sbp_custom_config_ptr->sbp_cust_cfg_feature_val;
break;
}
}
// all indices are not empty, update fail
if (i == SBP_MAX_CUSTOM_CONFIG)
{
MD_TRC_INFO_SBP_UPDATE_NVRAM_NO_EMPTY_FAIL();
result = KAL_FALSE;
}
}
if (result == KAL_TRUE)
{
nvram_external_write_data(NVRAM_EF_SBP_CUSTOM_MODEM_CONFIG_LID,
1,
(kal_uint8*)sbp_custom_modem_config_nv_ptr,
NVRAM_EF_SBP_CUSTOM_MODEM_CONFIG_SIZE);
}
}
else
{
MD_TRC_INFO_SBP_UPDATE_NVRAM_ACCESS_FAIL();
}
// Free allocated buffer
free_ctrl_buffer(sbp_custom_modem_config_nv_ptr);
return result;
}
/*****************************************************************************
* FUNCTION
* sbp_get_custom_config_nv_with_mcf
*
* DESCRIPTION
* This function reads NVRAM_EF_SBP_CUSTOM_MODEM_CONFIG_LID and applies MCF OTA by OP change
* This funciton uses latest DSBP SIM info and shall not be used during DSBP
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* void
*
*****************************************************************************/
kal_bool sbp_get_custom_config_nv_with_mcf(protocol_id_enum ps_id, nvram_ef_sbp_custom_modem_config_struct * sbp_custom_modem_config_nv_ptr)
{
mcf_tlvota_sbp_tag_t sbp_tag;
kal_bool result = KAL_FALSE;
result = nvram_external_read_data(NVRAM_EF_SBP_CUSTOM_MODEM_CONFIG_LID,
1,
(kal_uint8*)sbp_custom_modem_config_nv_ptr,
NVRAM_EF_SBP_CUSTOM_MODEM_CONFIG_SIZE);
if (result == KAL_TRUE)
{
// get SBP tag from latest mode2 info
memset(&sbp_tag.mcc,'\0',sizeof(kal_uint8)*MAX_MCC_STR_LEN);
memset(&sbp_tag.mnc,'\0',sizeof(kal_uint8)*MAX_MNC_STR_LEN);
sbp_tag.sbp_id = sbp_get_sim_sbp_id_for_all(ps_id); // MCF OTA by OP uses mode2 DSBP
memcpy(&sbp_tag.mcc, &sbp_cntxt_g[ps_id].mcc, sizeof(kal_uint8)*MAX_MCC_STR_LEN);
memcpy(&sbp_tag.mnc, &sbp_cntxt_g[ps_id].mnc, sizeof(kal_uint8)*MAX_MNC_STR_LEN);
mcf_read_tlvota_buffer_sbp_tag(ps_id, sbp_tag, NVRAM_EF_SBP_CUSTOM_MODEM_CONFIG_LID,
(kal_uint8 *)sbp_custom_modem_config_nv_ptr, NVRAM_EF_SBP_CUSTOM_MODEM_CONFIG_SIZE);
}
return result;
}
/*****************************************************************************
* FUNCTION
* sbp_get_max_custom_config
*
* DESCRIPTION
* This function gets MAX custom config NV entries
*
* PARAMETERS
* [IN] N/A
* RETURNS
* void
*
*****************************************************************************/
kal_uint16 sbp_get_max_custom_config(void)
{
return SBP_MAX_CUSTOM_CONFIG;
}
/*****************************************************************************
* FUNCTION
* sbp_get_dsbp_config
*
* DESCRIPTION
* This function is used to get dsbp config
*
* PARAMETERS
* void
* RETURNS
* nvram_ef_sbp_dsbp_config_struct
*
*****************************************************************************/
nvram_ef_sbp_dsbp_config_struct* sbp_get_dsbp_config()
{
return &sbp_common_cntxt_g.dsbp_config;
}
/*****************************************************************************
* FUNCTION
* nvram_custom_config_refresh_sbp_id_mapping_when_mcf_ota_start
*
* DESCRIPTION
* This function is used to re-read NVRAM and update the globle custom sbp_id mapping table
* when MCF default OTA triggered.
*
* PARAMETERS
* [IN] N/A
* RETURNS
* void
*
*****************************************************************************/
void nvram_custom_config_refresh_sbp_id_mapping_when_mcf_ota_start(void)
{
nvram_external_read_data(NVRAM_EF_SBP_CUSTOM_SBP_ID_MAPPING_LID,
1,
(kal_uint8*)&g_custom_sbp_id_mapping_table,
NVRAM_EF_SBP_CUSTOM_SBP_ID_MAPPING_SIZE);
nvram_external_read_data(NVRAM_EF_SBP_MDCXP_SBP_ID_LIST_LID,
1,
(kal_uint8*)&g_mdcxp_sbp_id_list,
NVRAM_EF_SBP_MDCXP_SBP_ID_LIST_SIZE);
}
/*****************************************************************************
* FUNCTION
* sbp_get_md_cxp_sbp_id
*
* DESCRIPTION
* This function is used to get trigger modem CXP (device) sbp_id
*
* PARAMETERS
* kal_uint32 sim_sbp_id
* RETURNS
* kal_uint32 md_cxp_sbp_id
*
*****************************************************************************/
kal_uint32 sbp_get_md_cxp_sbp_id(kal_uint32 sim_sbp_id)
{
kal_uint8 i;
for (i=0; i < SBP_MAX_MDCXP_SBP_ID_NUM; i++)
{
if (g_mdcxp_sbp_id_list.sbp_id_list[i] == sim_sbp_id)
{
// sim_sbp_id found in list
return sim_sbp_id;
}
}
// sim_sbp_id not found in list, treat as OM
return 0;
}
/*****************************************************************************
* FUNCTION
* sbp_set_md_cxp_sbp_id
*
* DESCRIPTION
* This function is used to add trigger modem CXP (device) sbp_id
*
* PARAMETERS
* kal_uint32 sbp_id
* RETURNS
*
*****************************************************************************/
void sbp_set_md_cxp_sbp_id(kal_uint32 sbp_id)
{
kal_uint8 i;
for (i=0; i < SBP_MAX_MDCXP_SBP_ID_NUM; i++)
{
if (g_mdcxp_sbp_id_list.sbp_id_list[i] == 0)
{
g_mdcxp_sbp_id_list.sbp_id_list[i] = sbp_id;
return ;
}
}
return ;
}
/*****************************************************************************
* FUNCTION
* sbp_get_custom_sbp_id_mapping_table
*
* DESCRIPTION
* This function is used to get the globle custom sbp_id mapping table
*
* PARAMETERS
* void
* RETURNS
* nvram_ef_sbp_custom_sbp_id_mapping_struct
*
*****************************************************************************/
nvram_ef_sbp_custom_sbp_id_mapping_struct* sbp_get_custom_sbp_id_mapping_table(void)
{
return &g_custom_sbp_id_mapping_table;
}
#if defined (__TC01_NVRAM__) || defined(__TC01__) // __TC01_CUST_SBP__
/*****************************************************************************
* FUNCTION
* sbp_query_md_feature_custom()
*
* DESCRIPTION
* clone sbp_query_md_feature() for customer's SBP.
*
* PARAMETERS
* feature [IN] customer's modem feature
*
* RETURNS
* KAL_TRUE : if this feature is turned on
* KAL_FALSE : if this feature is turned off
*****************************************************************************/
kal_bool sbp_query_md_feature_custom(sbp_md_feature_custom_enum feature)
{
return sbp_query_md_feature_by_ps_custom(feature, PROTOCOL_1);
}
/*****************************************************************************
* FUNCTION
* sbp_query_md_feature_by_ps_custom()
*
* DESCRIPTION
* clone sbp_query_md_feature_by_ps() for customer's SBP.
*
* PARAMETERS
* feature [IN] customer's modem feature
* ps_id [IN] PS ID
*
* RETURNS
* KAL_TRUE : if this feature is turned on
* KAL_FALSE : if this feature is turned off
*****************************************************************************/
kal_bool sbp_query_md_feature_by_ps_custom(sbp_md_feature_custom_enum feature, protocol_id_enum ps_id)
{
kal_uint8 *bitmask_ptr;
kal_uint32 byte_offset;
kal_uint8 bit_offset;
kal_bool result;
#ifndef __L1_STANDALONE__
static sbp_md_feature_custom_enum latest_queried_sbp[MAX_SIM_NUM];
#endif
if (feature >= SBP_CUSTOM_MAX_MD_FEATURE)
{
ASSERT(0);
}
if (ps_id >=MAX_SIM_NUM)
{
#ifndef __L1_STANDALONE__
MD_TRC_ERROR_SBP_INVALID_PS_ID(ps_id);
#endif
return KAL_FALSE;
}
byte_offset = feature / 8;
bit_offset = feature % 8;
bitmask_ptr = &(sbp_cntxt_g[ps_id].modem_cust_sbp_config[byte_offset]);
result = (((*bitmask_ptr) & (0x01 << bit_offset)) != 0)? KAL_TRUE : KAL_FALSE;
#ifndef __L1_STANDALONE__
if (latest_queried_sbp[ps_id] != feature)
{
// kal_brief_trace(TRACE_GROUP_1, INFO_CUSTOM_SBP_FEATURE, ps_id, feature, result);
latest_queried_sbp[ps_id] = feature;
}
#endif
return result;
}
/*****************************************************************************
* FUNCTION
* sbp_set_md_feature_custom()
*
* DESCRIPTION
* clone sbp_set_md_feature() for customer's SBP.
*
* PARAMETERS
* feature [IN] customer's modem feature
* is_turned_on [IN]
* sbp_feature_ptr [IN/OUT]
*
* RETURNS
* KAL_TRUE if success; otherwise KAL_FALSE
*****************************************************************************/
kal_bool sbp_set_md_feature_custom(sbp_md_feature_custom_enum feature,
kal_bool is_turned_on,
nvram_ef_sbp_modem_config_struct *sbp_feature_ptr)
{
kal_uint8 *bitmask_ptr;
kal_uint32 byte_offset;
kal_uint8 bit_offset;
if (feature >= SBP_CUSTOM_MAX_MD_FEATURE)
{
return KAL_FALSE;
}
else
{
byte_offset = feature / 8;
bit_offset = feature % 8;
bitmask_ptr = &(sbp_feature_ptr->modem_sbp_config[byte_offset]);
if (is_turned_on == KAL_TRUE)
{
*bitmask_ptr = ((*bitmask_ptr) | (0x01 << bit_offset));
}
else
{
*bitmask_ptr = ((*bitmask_ptr) & ~(0x01 << bit_offset));
}
}
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_set_md_feature_by_ps_custom()
*
* DESCRIPTION
* clone sbp_set_md_feature_by_ps() for customer's SBP.
*
* PARAMETERS
* feature [IN] customer's modem feature
* is_turned_on [IN]
* sbp_feature_ptr [IN/OUT]
*
* RETURNS
* KAL_TRUE if success; otherwise KAL_FALSE
*****************************************************************************/
kal_bool sbp_set_md_feature_by_ps_custom(sbp_md_feature_custom_enum feature,
kal_bool is_turned_on,
protocol_id_enum ps_id)
{
kal_uint8 *bitmask_ptr;
kal_uint32 byte_offset;
kal_uint8 bit_offset;
if (feature >= SBP_CUSTOM_MAX_MD_FEATURE)
{
return KAL_FALSE;
}
else
{
byte_offset = feature / 8;
bit_offset = feature % 8;
bitmask_ptr = &(sbp_cntxt_g[ps_id].modem_cust_sbp_config[byte_offset]);
if (is_turned_on == KAL_TRUE)
{
*bitmask_ptr = ((*bitmask_ptr) | (0x01 << bit_offset));
}
else
{
*bitmask_ptr = ((*bitmask_ptr) & ~(0x01 << bit_offset));
}
#ifndef __L1_STANDALONE__
// kal_brief_trace(TRACE_INFO, INFO_CUSTOM_SBP_SET_FEATURE, ps_id, feature, is_turned_on);
#endif
}
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_general_set_md_feature_custom()
*
* DESCRIPTION
* clone sbp_general_set_md_feature() for customer's SBP.
*
* PARAMETERS
* feature [IN] customer's modem feature
* is_turned_on [IN]
*
* RETURNS
* KAL_TRUE if success; otherwise KAL_FALSE
*****************************************************************************/
kal_bool sbp_general_set_md_feature_custom(sbp_md_feature_custom_enum feature, kal_bool is_turned_on)
{
kal_uint8 i;
if (feature >= SBP_CUSTOM_MAX_MD_FEATURE)
{
return KAL_FALSE;
}
else
{
for (i=0; i<MAX_SIM_NUM; i++)
sbp_set_md_feature_by_ps_custom( feature, is_turned_on, i);
}
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_update_features_to_nvram_custom()
*
* DESCRIPTION
* clone sbp_update_features_to_nvram() for customer's SBP.
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
kal_bool sbp_update_features_to_nvram_custom()
{
nvram_ef_sbp_modem_config_struct sbp_local_config;
sbp_local_config.sbp_mode = SBP_ID_INVALID;
kal_mem_cpy(sbp_local_config.modem_sbp_config, sbp_cntxt_g[SIM1].modem_cust_sbp_config, (SBP_CUSTOM_MAX_MD_FEATURE/8)+1);
nvram_external_write_data(NVRAM_EF_SBP_MODEM_CONFIG_LID,
NVRAM_CUST_SBP_IDX,
(kal_uint8*)&sbp_local_config,
NVRAM_EF_SBP_MODEM_CONFIG_SIZE);
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_get_sbp_feature_raw_config_custom()
*
* DESCRIPTION
* clone sbp_get_sbp_feature_raw_config() for customer's SBP.
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
kal_bool sbp_get_sbp_feature_raw_config_custom(protocol_id_enum ps_id, kal_uint8 *raw_config)
{
kal_mem_cpy(raw_config, sbp_cntxt_g[ps_id].modem_cust_sbp_config, (SBP_CUSTOM_MAX_MD_FEATURE/8)+1);
return KAL_TRUE;
}
/*****************************************************************************
* FUNCTION
* sbp_set_sbp_feature_raw_config_custom()
*
* DESCRIPTION
* clone sbp_set_sbp_feature_raw_config() for customer's SBP.
*
* PARAMETERS
* ps_id [IN] protocol ID
*
* RETURNS
* KAL_TRUE - success
* KAL_FALSE - failure
*
*****************************************************************************/
void sbp_set_sbp_feature_raw_config_custom(protocol_id_enum ps_id, kal_uint8 *raw_config)
{
kal_mem_cpy(sbp_cntxt_g[ps_id].modem_cust_sbp_config, raw_config, (SBP_CUSTOM_MAX_MD_FEATURE/8)+1);
}
#endif /* (__TC01_NVRAM__) || defined(__TC01__)*/
#ifdef __IPC_ADAPTER__
/*****************************************************************************
* FUNCTION
* sbp_get_salecode()
*
* DESCRIPTION
* This function is used to get salecode of this ps_id
* If network code is present, network code is given
* otherwise, csc_salecode is given
*
* PARAMETERS
* ps_id [IN] protocol ID
* param [IN] salecode
* RETURNS
* void
*
*****************************************************************************/
void sbp_get_salecode(kal_char *salecode, protocol_id_enum ps_id)
{
kal_uint8 sim_id;
sim_id = l4c_gemini_get_actual_sim_id(ps_id);
if (sim_id == SIM1)
{
if (sbp_salecode.network_code[0] == 0 && sbp_salecode.network_code[1] == 0 && sbp_salecode.network_code[2] == 0)
{
memcpy( (void *) salecode, (void *) sbp_salecode.csc_salecode, 3);
}
else
{
memcpy( (void *) salecode, (void *) sbp_salecode.network_code, 3);
}
}
else if (sim_id == SIM2)
{
if (sbp_salecode.network_code_2[0] == 0 && sbp_salecode.network_code_2[1] == 0 && sbp_salecode.network_code_2[2] == 0)
{
memcpy( (void *) salecode, (void *) sbp_salecode.csc_salecode, 3);
}
else
{
memcpy( (void *) salecode, (void *) sbp_salecode.network_code_2, 3);
}
}
}
void sbp_get_csc_salecode(kal_char *salecode)
{
memcpy( (void *) salecode, (void *) sbp_salecode.csc_salecode, 3);
}
void sbp_get_network_code_salecode(kal_char *salecode, protocol_id_enum ps_id)
{
kal_uint8 sim_id;
sim_id = l4c_gemini_get_actual_sim_id(ps_id);
if (sim_id == SIM1)
{
memcpy( (void *) salecode, (void *) sbp_salecode.network_code, 3);
}
else if (sim_id == SIM2)
{
memcpy( (void *) salecode, (void *) sbp_salecode.network_code_2, 3);
}
}
#endif /* __IPC_ADAPTER__ */