#define RIL_REQUEST_SET_UICC_SUBSCRIPTION 122
从一张sim卡中选择某个application作为subscription,更通俗的讲就是对卡里的application进行provisioning/dis-provisioning
从telephony传到QCRIL的结构
typedef struct {
int slot; //哪个卡槽 /* 0, 1, ... etc. */
int app_index; //app index /* array subscriptor from applications[RIL_CARD_MAX_APPS] in
RIL_REQUEST_GET_SIM_STATUS */
RIL_SubscriptionType sub_type; //这个与Modem stack对应,也就是Modem的sub /* Indicates subscription 1 or subscription 2 */
RIL_UiccSubActStatus act_status; //是激活还是去激活
} RIL_SelectUiccSub;
来看下Qcril里对应的处理函数
qcril_qmi_nas_set_uicc_subscription()
select_uicc_sub_ptr = (RIL_SelectUiccSub *) params_ptr->data; //获得telephony传下来的参数
// Update sub id as stack id to handle cross mapping scenario.
// UIM requires stack-id to activate the subscription as pri or sec.
// In case of straight mapping stack id = sub id.
select_uicc_sub_ptr->sub_type = qcril_qmi_nas_get_modem_stack_id(); //获得当前RILD进程与Modem进行map的stack id, 后续会转换成session type
//获得当前Mode Pref的值
qmi_client_send_msg_sync_with_shm( qcril_qmi_client_get_user_handle ( QCRIL_QMI_CLIENT_NAS ),
QMI_NAS_GET_MODE_PREF_REQ_MSG_V01,
//如果对应的Modem stack0, 其实用的就是primary sub, 那么就将idx0转换成mode_pref, 如果对应的是Modem stack1,那对应的就是secondary sub, 用idx0
//注意这里的mode_pref只表示1X还是GW类型的。
if ( RIL_SUBSCRIPTION_1 == select_uicc_sub_ptr->sub_type )
{
mode_pref = qcril_qmi_nas_conv_nas_mode_pref_to_qcril(qmi_mode_pref_resp.idx0_mode_pref_valid, qmi_mode_pref_resp.idx0_mode_pref, select_uicc_sub_ptr );
}
//将Telephony传过来的参数保存起来,用作后用
memset( &subs_info, 0, sizeof(subs_info) );
memcpy( &subs_info.uicc_subs_info, select_uicc_sub_ptr, sizeof( RIL_SelectUiccSub ) );
subs_info.subs_mode_pref = mode_pref; //保存mode_pref的值,即当前的stack是1x类型的还是GW类型的
//以ACTIVATE为例
if ( select_uicc_sub_ptr->act_status == RIL_UICC_SUBSCRIPTION_ACTIVATE )
{
QCRIL_LOG_DEBUG( "Request QCRIL(UIM) to activate slot %d aid %d", select_uicc_sub_ptr->slot, select_uicc_sub_ptr->app_index );
err_no = qcril_process_event( instance_id, modem_id, QCRIL_EVT_INTERNAL_MMGSDI_ACTIVATE_SUBS,
(void *) &subs_info, sizeof( qcril_uicc_subs_info_type ),
(RIL_Token) QCRIL_TOKEN_ID_INTERNAL );
QCRIL_LOG_INFO( ".. QCRIL_EVT_INTERNAL_MMGSDI_ACTIVATE_SUBS res %d", (int) err_no );
}
接着来看下QCRIL_EVT_INTERNAL_MMGSDI_ACTIVATE_SUBS的后续处理
08:47:20.376 qcril_uim_card.c 03706 RIL[0][cmd-122(544)] qcril_uim_process_change_subscription: qcril_uim_process_change_subscription: RID: 0x0, MID:0x0, slot: 0x0, app_index: 0x0, sub_type: 0x1, act_status: 0x1
QCRIL_EVT_INTERNAL_MMGSDI_ACTIVATE_SUBS->qcril_uim_process_internal_command()->qcril_uim_process_change_subscription()
1