| 帮同学宣传一下http://shop57644665.taobao.com/ |
本节描述了SIM向GSM的MM和GMM提供的信息。
在GSM协议11.11中对GSM操作的前提有如下描述
For a SIM of Phase 2 or greater, GSM operation shall only start if one of the two following conditions is
fulfilled:
- if EFIMSI and EFLOCI are not invalidated, the GSM operation shall start immediately;
- if EFIMSI and EFLOCI are invalidated, the ME rehabilitates these two EFs.
那么SIM应该提供哪些信息呢?流程是什么样的呢?
Afterwards, the ME runs the following procedures:
- Administrative Information request;
- SIM Service Table request;
- IMSI request;
- Access Control request;
- HPLMN Search Period request;
- PLMN selector request;
- Location Information request;
- Cipher Key request;
- BCCH information request;
- Forbidden PLMN request;
- CBMID request;
- Depersonalisation Control Keys request
- Network’s indication of alerting request (if $(NIA)$ is supported)
好了,我们来看看TI是如何实现这部分协议栈的代码的吧。
总的流程如下(app_sim_read_parameters函数中)
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 ();
在app_fdn_bdn_procedures函数中会对SIM的IMSI和LOCI是否支持进行判断,同时对bdn和fdn进行判断。
当然一般的SIM卡肯定不会是SIM_NO_OPERATION的,所以必然会进行app_sim_mm_insert_ind (sim_mmi_insert_ind)。
GLOBAL UBYTE app_sim_mm_insert_ind (T_SIM_MMI_INSERT_IND * sim_mmi_insert_ind)
{
//首先分配一个SIMMM协议原语
PALLOC (sim_mm_insert_ind, SIM_MM_INSERT_IND);
SIM_CLEAR_FLAG (TEST_SIM_INSERTED);
//读取administrative data
if (FKT_Select (SIM_AD, response, SIM_MIN_EF_ST_LEN) EQ SIM_NO_ERROR)
sim_mm_insert_ind->c_ad = (UBYTE)length;
if(FKT_ReadBinary ((UBYTE *)&sim_mm_insert_ind->ad, 0, length) EQ SIM_NO_ERROR)
//如果ad[0]&0x80为真表示这是一张测试卡
if(sim_mm_insert_ind->ad[0] & 0x80)
{
SIM_SET_FLAG (TEST_SIM_INSERTED);
#if defined SIM_TOOLKIT
SIM_SET_FLAG (TEST_MODE_POLLING);
#endif
}
/*
* read IMSI (set to zero in case of error)
*/
memset (&sim_mmi_insert_ind->imsi_field, 0, sizeof (T_imsi_field));
if (FKT_Select (SIM_IMSI, NULL, 0) EQ SIM_NO_ERROR)
{
if (FKT_ReadBinary ((UBYTE *)&sim_mm_insert_ind->imsi_field, 0, MAX_IMSI)
…………..
}
/*
* Modify polling algorithm in case of HPLMN == Test Network
*/
if ((sim_mm_insert_ind->imsi_field.c_field >= 3) AND
((sim_mm_insert_ind->imsi_field.field[0] & 0xF7) EQ 0x01) AND
(sim_mm_insert_ind->imsi_field.field[1] EQ 0x10) AND
(sim_mm_insert_ind->imsi_field.field[2] EQ 0x10))
{
SIM_SET_FLAG (TEST_SIM_INSERTED);
#if defined SIM_TOOLKIT
SIM_SET_FLAG (TEST_MODE_POLLING);
#endif
}
/*
* read location information
*/
if (FKT_Select (SIM_LOCI, NULL, 0) EQ SIM_NO_ERROR)
/*
* Access control classes
*/
if (FKT_Select (SIM_ACC, NULL, 0) EQ SIM_NO_ERROR)
/*
* BCCH information
*/
if (FKT_Select (SIM_BCCH, NULL, 0) EQ SIM_NO_ERROR)
/*
* KC and cipher key sequence number
*/
if (FKT_Select (SIM_KC, NULL, 0) EQ SIM_NO_ERROR)
/*
* Read Preferred PLMNs
*/
if (SIM_IS_FLAG_SET (SERVICE_7_SUPPORT))
{
if (FKT_Select (SIM_PLMNSEL, response, SIM_MIN_EF_ST_LEN) EQ SIM_NO_ERROR)
/*
* Read forbidden PLMNs
*/
if (FKT_Select (SIM_FPLMN, NULL, 0) EQ SIM_NO_ERROR)
/*
* Read Acting HPLMN
*/
FileSelRes = FKT_Select(SIM_CING_AHPLMN, NULL, 0);
#if defined (GPRS)
gprs_gmm_insert_ind (sim_mm_insert_ind);
#endif
/*
* send information to mobility management
*/
PSENDX (MM, sim_mm_insert_ind);
SIM_SET_FLAG (MM_KNOWS_FROM_SIM);
}

















May 28, 2009 @ 2:03 pm.
果然嵌入式,哈哈,你太牛了!!!