SIM协议栈实体在系统启动时会进行什么样的初始化步骤呢?以下以TI的协议栈实现来分析。
在app_init_sim_data这个函数中注册了SIM的insert和remove的hook函数。
simdrv_register(app_sim_insert, app_sim_remove);
GLOBAL void app_sim_insert( T_SIMDRV_atr_string_info *atr_string_info,
U8 config_requested,
T_SIMDRV_config_characteristics *config_characteristics)
{
//在ATR处理完成后,首先将当前dir设为MF
sim_data.act_directory = SIM_MF;
//首先选择DFgsm
error = FKT_Select (SIM_DF_GSM, response, SIM_MIN_DMF_ST_LEN);
//如果成功选择将返回信息存入dir_status中,并设置标识
SIM_SET_FLAG (GSM_DATAFIELD);
//否则选择DF1800
error = FKT_Select (SIM_DF_1800, response, SIM_MIN_DMF_ST_LEN);
SIM_CLEAR_FLAG (GSM_DATAFIELD);
然后分配一个协议原语
T_SIM_ACTIVATE_CNF * sim_activate_cnf;
if (SIM_IS_FLAG_SET (ACTIVATION_STARTED))
{
PALLOC (sim_activate, SIM_ACTIVATE_CNF);
sim_activate_cnf = sim_activate;
}
else
{
PALLOC (sim_activate, SIM_ACTIVATE_IND);
sim_activate_cnf = (T_SIM_ACTIVATE_CNF *)sim_activate;
}
//然后读取ECC
if (FKT_Select (SIM_ECC, response, SIM_MIN_EF_ST_LEN) EQ SIM_NO_ERROR)
FKT_ReadBinary (sim_activate_cnf->ec_code, 0, length);
//然后读取LP
if (FKT_Select (SIM_LP, response, SIM_MIN_EF_ST_LEN) EQ SIM_NO_ERROR)
FKT_ReadBinary (sim_activate_cnf->pref_lang, 0, length);
//将atr也放入协议原语中
memcpy (sim_activate_cnf->atr, atr_string_info->atr_string, length);
//接着检查PIN与PUk的状态
SIM_CLEAR_FLAG (SIM_PIN_FLAG);
sim_activate_cnf->pin_cnt = FKT_check_pin_count (dir_status.pinstatus);
sim_activate_cnf->puk_cnt = FKT_check_pin_count (dir_status.unbstatus);
sim_activate_cnf->pin2_cnt = FKT_check_pin_count (dir_status.pin2status);
sim_activate_cnf->puk2_cnt = FKT_check_pin_count (dir_status.unb2status);
//然后根据pin与puk的状态设置
sim_activate_cnf->cause = SIM_CAUSE_PIN1_EXPECT/SIM_CAUSE_PIN1_EXPECT;
//如果是SIM_CAUSE_PUK1_BLOCKED则向mmi发送消息后直接返回,不在继续向MM和GMM发送消息的过程。
TRACE_EVENT (”Card blocked”);
sim_activate_cnf->cause = SIM_CAUSE_PUK1_BLOCKED;
SIM_EM_SIM_ACTIVATION_RESULT;
PSENDX (MMI, sim_activate_cnf);
SIM_CLEAR_FLAG (ACTIVATION_STARTED);
return;
//如果pin与puk不需要则继续向下执行,否则等待pin与puk的验证。
if (SIM_IS_FLAG_CLEARED (SIM_PIN_FLAG))
/*
* PIN entering is not necessary
*/
{
SIM_SET_FLAG(PIN1_VERIFIED);
TRACE_EVENT (”Read the rest of Parameters”);
app_sim_read_parameters ();
app_start_status_timer (TRUE);
}
else
{
TRACE_EVENT (”Wait for PIN/PUK entering”);
SIM_CLEAR_FLAG (MM_KNOWS_FROM_SIM);
vsi_t_stop (VSI_CALLER SIM_TIMER);
}
app_sim_read_parameters ()
{
//分配SIM_MMI_INSERT_IND协议原语
PALLOC (sim_mmi_insert_ind, SIM_MMI_INSERT_IND);
接着读取SIM的Phase
error = FKT_Select (SIM_PHASE, NULL, 0);
if (error EQ SIM_NO_ERROR)
error = FKT_ReadBinary (&sim_data.sim_phase, 0, 1);
if (sim_data.sim_phase EQ 0)
sim_data.sim_phase = 1;
if (sim_data.sim_phase > 3)
sim_data.sim_phase = 3;
Phase为1的情况下会进行如下操作
// try to read the SIM service table
if (!app_read_sim_service_table(sim_mmi_insert_ind))
{
app_sim_mmi_insert_ind (sim_mmi_insert_ind, SIM_NO_OPERATION);
return;
}
if (app_sim_mm_insert_ind (sim_mmi_insert_ind) EQ FALSE)
app_sim_mmi_insert_ind (sim_mmi_insert_ind, SIM_NO_OPERATION);
else
app_sim_mmi_insert_ind (sim_mmi_insert_ind, SIM_ADN_ENABLED) ;
PSENDX (MMI, sim_mmi_insert_ind);
app_sim_sms_insert_ind ();
Phase为2+的情况说明该sim卡支持STK服务。
stk_perform_profile_download ();
/* Update the Terminal Support table*/
if(FKT_Select(SIM_CING_TRMST, NULL, 0) EQ SIM_NO_ERROR)
{
FKT_UpdateBinary (sim_data.trmst, MAX_TRMST, 0);
}
Phase 2和2+会接着进行如下的操作
result = app_fdn_bdn_procedures (sim_mmi_insert_ind);
if ((result EQ SIM_NO_OPERATION) OR
!app_sim_mm_insert_ind (sim_mmi_insert_ind))
app_sim_mmi_insert_ind (sim_mmi_insert_ind, SIM_NO_OPERATION);
else
app_sim_mmi_insert_ind (sim_mmi_insert_ind, result);
PSENDX (MMI, sim_mmi_insert_ind);
if (result NEQ SIM_NO_OPERATION)
app_sim_sms_insert_ind ();
}
}






















