MMGSDI启动流程

来源:互联网 发布:淘宝群优惠群怎么做的 编辑:程序博客网 时间:2024/06/05 05:38

 

首先会来一个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的静态变量里面

 

 

 

 

原创粉丝点击