首先会来一个GSDI_HIGH_PRI_CMD_Q_SIG信号
来的msg_set是MS_GSDI_RESET_COMPLETE重设完成
msg_id=GSDI_ERROR_CONDITION_2;当uim卡2检查失败时会发这个通知信息
处理完这个signal之后
2会再来一个GSDI_HIGH_PRI_CMD_Q_SIG
msg_set=MS_GSDI_RESET_COMPLETE
msg_id=GSDI_LINK_ESTABLISHED_MSG
在这里面会通过mmgsdi_vet_cb发mmgsdi_build_internal_pup_req请求
且mmgsdi_init_rtre_config
3在此之后,会由UIM发来一个MMGSDI_CLIENT_ID_AND_EVT_REG_REQ的注册命令 MMGSDI_TASK_CMD_Q_SIG
由mmgsdi_add_client_id_entry函数会生成client_id
处理完注册后,给自身发MMGSDI_TASK_RSP_Q_SIG信号+MMGSDI_CLIENT_ID_REG_RSP
这个信号的处理知识在全局变量中查找指定的id是否注册成功,如注册成功
会发一个cnf信息给本身MMGSDI_TASK_RSP_Q_SIG
mmgsdi_process_cnf处理cnf
详细看这个函数:
里面包括两个处理,一个response、一个event_callback
1、response:
调用的是:nvruim_mmgsdi_reg_cb函数,他记录下注册的client_id 然后发起一个mmgsdi_session_open函数:MMGSDI_1X_PROV_PRI_SESSION
来获取session_id
2、event_callback:
发MMGSDI_STATE_CARD_INSERTED状态
通知单个的client,调用的回调函数是nvruim_mmgsdi_evt_cb,然而其实没有做任何的事,只是成功返回
之后又两个mmgsdi_session_open,请求session
1:MMGSDI_1X_PROV_PRI_SESSION,NULL
2:MMGSDI_GW_PROV_PRI_SESSION
继续看对这两个请求的回复cnf的处理:
1:MMGSDI_1X_PROV_PRI_SESSION,NULL:
1、response:调用的是nvruim_mmgsdi_reg_cb
cnf=MMGSDI_SESSION_OPEN_CNF
在函数里面又发起一个mmgsdi_session_open:MMGSDI_1X_PROV_SEC_SESSION
2、event_callback:
通知的是单个的client
evt_info_ptr->evt=MMGSDI_SESSION_CHANGED_EVT
调用的回调函数是:mmocmmgsdi_card_status_cb,没做任何事
MMGSDI_SUBSCRIPTION_READY_EVT
mmgsdi_build_internal_pup_req
在接到MMGSDI_SESSION_ACTIVATE_OR_SWITCH_PROVISIONING_CNF确认后,当然先前已经发过MMGSDI_SESSION_ACTIVATE_OR_SWITCH_PROVISIONING_REQ请求命令
调用mmgsdi的mmgsdi_evt_cb回调函数
MMGSDI_SESSION_CHANGED_EVT=event.evt
发MMGSDI_CARD_INSERTED_EVT事件给本身,伴随的状态是MMGSDI_APP_STATE_DETECTED,这是一个暂时的状态
具体由mmgsdi_build_internal_pup_req发powerup请求给mmgsdi
只有在mmgsdi_cnf_generate_evt函数里才会对所有的client发event事件
mmgsdi_process_internal_pup_init_cb会发subscription_reday
client_id = 6217114488382947328
evt_cb_ptr = 0x007511D9
client_id = 6764212572213215232
evt_cb_ptr = 0x0
ui_net_set_slot_mode:对应Successful queue of MMGSDI_SESSION_ACT_OR_SWITCH_PROV cmd
同时MMGSDI_SESSION_ACT_OR_SWITCH_PROV_REQ命令在mmgsdi的处理流程:
1 mmgsdi_session_main
2 mmgsdi_session_proc_act_or_switch_prov
3 mmgsdi_session_build_uim_open_channel_rsp
4 request_header.request_type = MMGSDI_SESSION_OPEN_REQ
在mmgsdi_prcoess_response里处理
在里面发的cnf为MMGSDI_SESSION_ACTIVATE_OR_SWITCH_PROVISIONING_CNF
然后在mmgsdi_process_cnf里处理
它调用的回复函数是ui_net_mmgsdi_internal_cb
event_proc函数处理如下
MMGSDI_SESSION_CHANGED_EVT
mmgsdi_evt_build_and_send_session_changed
MMGSDI_SESSION_ACTIVATE_OR_SWITCH_PROVISIONING_CNF||MMGSDI_SESSION_SELECT_AID_CNF
mmgsdi_cnf_generate_evt
在回复的事件处理中会发起mmgsdi_session_get_all_pin_status 和mmgsdi_evt_build_and_send_card_select_aid两个请求
mmgsdi_evt_build_and_send_card_select_aid事件发送处理的详细流程:
evt_info_ptr->evt = MMGSDI_SELECT_AID_EVT发给UI
notify all client :mmgsdi_evt_notify_client:调用的回调函数有如下:
1、mmgsdi_evt_cb在里面发起(void)mmgsdi_build_internal_pup_req():MMGSDI_APP_STATE_ACTIVATED,app_state从detected to activated
在mmgsdi接到这个消息之后才会处理这个信号,具体的后面的处理如下:
会发起mmgsdi_session_get_all_pin_status:MMGSDI_GET_ALL_PIN_STATUS_REQ
MMGSDI_GET_ALL_PIN_STATUS_REQ请求的处理:
只是发了一个回复报告给mmgsdi去处理
1》在response处理中如果缓存中有PIN
则发CNF
cnf的处理中
2》如果缓存中没有,则往uim发UIM_CACHED_SEL_F读取
之后再发cnf,和1的处理是一样的
回复处理函数mmgsdi_util_internal_cb:MMGSDI_GET_ALL_PIN_STATUS_CNF
mmgsdi_cnf_generate_get_all_pin_status_evt /*Send the PIN Event*/
在这个函数里面会发3个mmgsdi_evt_build_pin,是pin event 事件
第一个的处理如下:
调用的回调函数:
1.1、mmgsdi_evt_cb:mmgsdi_state_pin1_update
mmgsdi_build_internal_pup_req(MMGSDI_SLOT_AUTOMATIC,
session_id,
MMGSDI_PIN1_EVT,
MMGSDI_STATE_CARD_INSERTED, / /old state
MMGSDI_APP_STATE_READY_FOR_PERSO, //new state
NULL);
}
再讲mmgsdi接到这个之后的处理如下:
gsdi_proc_handle_client_req--->gsdi_process_post_pin1
notify_type.notify_type = MMGSDI_EVT_NOTIFY_ALL_SESSIONS;
mmgsdi_evt_build_and_send_perso:发event:evt_info_ptr->evt = MMGSDI_PERSO_EVT
在一个事件通知函数mmgsdi_evt_cb里面调用mmgsdi_state_perso_update
在他里面又调用如下:
mmgsdi_build_internal_pup_req(MMGSDI_SLOT_AUTOMATIC,
session_id,
MMGSDI_PIN1_EVT,
MMGSDI_STATE_CARD_INSERTED,
MMGSDI_APP_STATE_PERSO_VERIFIED,
NULL);
接着
gsdi_util_send_gsdi_cnf
mmgsdi_process_internal_pup_init_cb里面当
因为只有app_state == MMGSDI_APP_STATE_PERSO_VERIFIED时
此时回复报告中的app_state==MMGSDI_APP_STATE_READY_FOR_PERSO
暂时没发mmgsdi_evt_build_and_send_subscription_ready
在gsdi_util_send_gsdi_cnf的处理中会发
在接到MMGSDI_APP_STATE_PERSO_VERIFIED时处理如下:
gsdi_process_post_perso:mmgsdi_proc_post_pin1_init初始化一些数据
在gsdi_util_send_gsdi_cnf的处理中会发mmgsdi_evt_build_and_send_subscription_ready
1.2、nvruim_mmgsdi_evt_cb没做任何事
1.3、mmocmmgsdi_card_status_cb 7172f9 没做任何事
1.4、cmmmgsdi_card_status_cb 47877 //给cm发命令
。。。
第二个和第三个没什么重要处理
此时的PINstatus = MMGSDI_PIN_DISABLED,函数mmgsdi_evt_map_gsdi_even里此时的*old_evt_ptr = GSDI_PIN1_DISABLED
事件处理函数:mmgsdi_cnf_generate_evt
没做任何的处理
2、nvruim_mmgsdi_evt_cb:一些简单flag的设置
事件回调函数处理完成之后由mmgsdi_evt_build_and_send_orig_mmgsdi_event发信的event如下:
发mmgsdi_evt_build_and_send_card_select_aid也是notify all:mmgsdi_evt_notify_client
调用的回调函数有:
1mmgsdi_evt_cb:但是没做任何事
2、nvruim_mmgsdi_evt_cb:没做任何事
3、mmocmmgsdi_card_status_cb没做任何事
4、cmmmgsdi_card_status_cb没做任何事
5、ui_mmgsdi_card_status_cb没做
6wms_sim_mmgsdi_event_cb没做任何事
7、dsatme_mmgsdi_client_evt_reg_cb
8ds3g_mmgsdi_client_evt_reg_cb没做任何事
9、ppp_mmgsdi_client_id_reg_evt_rpt没做任何事
通知完后又会调用一次mmgsdi_evt_build_and_send_orig_mmgsdi_event,里面再调用
mmgsdi_evt_build_and_send_orig_mmgsdi_event但是没做任何事
完
当往UI发select_aid_event时GSDI_APP_SELECTED
5 mmgsdi_uim_report发response给mmgsdi
6 对应的事件处理之调用了两个回调函数,一个给mmgsdi本身,一个给nvruim
app state change to activated
gsdi_util_get_sim_ef_cache_length
nv_front_op
nvio_read
nvruim_read_accolc to-》
nvruim_read_and_check_rsp
item = NV_ACCOLC_I
open_session处理:
首先外面发open_session
接到命令后交给mmgsdi_process_commad处理
具体处理如下mmgsdi_session_main-》mmgsdi_session_proc_open:生成一个session_id
在这个client_id 数据结构下分配一个新的session_info来保存这个session信息,并初始化
session_ptr->channel_app_data_ptr此时为null
/* Build Confirmation */
发cnf报告mmgsdi_cnf_build_and_queue
之后由报告处理程序处理
报告处理程序有两步,一个是response,一个是evt_cb
response 保存session_id 或者再法医新的open_session
evt报告指定的client或者all_client 事件
app_info_ptr->app_state=MMGSDI_APP_STATE_ACTIVATED
mmgsdi_evt_build_and_send_session_changed发session change 命令给指定的client
将session_id保存在这个task的静态变量里面
完