msm8994 热插拔sim卡导致modem重新启动的流程
作者:lover713814 发布于:2015-5-28 15:23
Modem侧重新激活协议栈之后会调用mcfg_utils_reset_modem
mcfg_utils_reset_modem->
result = efs_sync ("/");
sys_m_request_peripheral_restart_ssreq(&mcfg_utils_sys_m_ssreq_reset_cb);
ssreq_process_request(SSREQ_PERIPHERAL_RESTART, ind_cb_fn);
case SSREQ_PERIPHERAL_RESTART:
ssreq_restart_peripheral();
ssreq_p_restart_req.ss_client_id = SSREQ_QMI_CLIENT_INSTANCE_MPSS_V01;
qmi_client_send_msg_sync(ssreq_client_handle,
SSREQ_PERIPHERAL_RESTART,(void*)&ssreq_p_restart_req,sizeof(ssreq_p_restart_req),
(void*)&ssreq_p_restart_resp,sizeof(ssreq_p_restart_resp),0
);//QMI_SSREQ_PERIPHERAL_RESTART_REQ_V01 0x0022//1 发送复位请求给AP
------------------------------------------------------------------------------------------------------------------
AP 侧收到QMI_SSREQ_PERIPHERAL_RESTART_REQ_V01的处理流程
in /msm8994_c3012.2/vendor/qcom/proprietary/peripheral-manager/pm-server/PeripheralManagerServer.cpp
qmi_csi_cb_error
qmiServerProcessRequest(void *__qmiClient,qmi_req_handle reqHandle,unsigned int
msgId, void *reqStruct,unsigned int reqStructLen,void *__pmService)
case QMI_SSREQ_PERIPHERAL_RESTART_REQ_V01:
qmiServerPeripheralRestart(qmiClient, reqHandle, msgId,reqStruct,
pmService);
pmService->restartPeripheral(identifier,
qmiClient);
peripheral =
findBySubSystem(identifier);
started = peripheral->setRestartRequested((void
*)qmiClient);
notifyClients(EVENT_PERIPH_GOING_OFFLINE);
client->eventSend(event);
mClientCb->notifyCallback((int32_t)event);
//pm_proxy_event_notifier ssctl_shutdown_cb app_event_notifier qmi_ril_pm_event_notifier
//all thest four call back function will call below
function
pm_client_event_acknowledge(client_cookie,
event);
client->ops->acknowledge(client->id, (int64_t)event);
//it should
call PeripheralManagerServer::acknowledge,but I don't know how!!
peripheral->notifyClientAck(client,
(enum pm_event)event);
response.resp.result =
QMI_RESULT_SUCCESS_V01;
response.resp.error = QMI_ERR_NONE_V01;
qmi_csi_send_resp(reqHandle, msgId,
&response, sizeof(response));//2 给modem侧回复复位请求的resp
peripheral->notifyClientAck(client,
(enum pm_event)event);
case EVENT_PERIPH_GOING_OFFLINE:
sendRestartIndication();
client = (qmi_client_handle)mRestartRequestor;
msgId = QMI_SSREQ_PERIPHERAL_RESTART_IND_V01;
ind.status = SSREQ_QMI_REQUEST_SERVICED_V01;
ret = qmi_csi_send_ind(client, msgId,
&ind, sizeof(ind));//3发送QMI_SSREQ_PERIPHERAL_RESTART_IND_V01给modem
if (mFileDesc > 0) {
if (!mSimulationMode)
ret =
close(mFileDesc);//will call subsys_device_close to ask modem do
graceful reset//5 进行modem close 的流程
mFileDesc = -1;
mPowerOffCount++;
notifyClients(EVENT_PERIPH_IS_OFFLINE);//6
change state to is offline
case EVENT_PERIPH_IS_OFFLINE
if (isRestartRequested())
setRestartRequested(NULL);
notifyClients(EVENT_PERIPH_GOING_ONLINE);//7
change state to going online
case EVENT_PERIPH_GOING_ONLINE:
if (mFileDesc < 0)
if (!mSimulationMode)
mFileDesc = open(mDeviceFile,
O_RDONLY);//8 will call subsys_device_open to reload and power on the
modem
mFileDesc = 1;
if (mFileDesc > 0)
mPowerOnCount++;
if (mFileDesc > 0) {
notifyClients(EVENT_PERIPH_IS_ONLINE);
subsys_device_close
subsystem_put(subsys_dev);
subsys_stop(subsys);
subsys->desc->sysmon_shutdown_ret = sysmon_send_shutdown(subsys->desc);//5.1给modem发送QMI_SSCTL_SHUTDOWN_REQ_V02,让modem自己做内部的shutdown 准备,并等待resp
notify_each_subsys_device(&subsys, 1,
SUBSYS_BEFORE_SHUTDOWN, NULL);//通知其他子系统
subsys->desc->shutdown(subsys->desc,
false);//5.2调用modem shutdown 函数给modem关机
subsys_set_state(subsys, SUBSYS_OFFLINE);
disable_all_irqs(subsys);
notify_each_subsys_device(&subsys, 1,
SUBSYS_AFTER_SHUTDOWN, NULL);
sysmon_send_shutdown
req_desc.msg_id = QMI_SSCTL_SHUTDOWN_REQ_V02//同步发送给modem并等待应答表示modem已经graceful shutdown 完毕
-------------------------------------------------------------------------------------------------------------------
4 Modem 收到 AP发送的QMI_SSREQ_PERIPHERAL_RESTART_IND_V01后的处理
mcfg_utils_sys_m_ssreq_reset_cb
mcfg_utils_cmd_send(MCFG_UTILS_CMD_RESET);
utils_cmd_data = (mcfg_utils_cmd_data_s_type *) cmd->data;
utils_cmd_data->cmd_id = utils_cmd;
mcfg_task_cmd_send(cmd)
case MCFG_UTILS_CMD_RESET
timer_set(&mcfg_utils_reset_timer, MCFG_UTILS_RESET_TIMER_TIMEOUT,0,
T_SEC);
timer 超时后会调用
mcfg_utils_cmd_reset_timer_cb 会重新调用
mcfg_utils_reset_modem(
#ifdef
MCFG_MODEM_INITITIATED_GRACEFUL_RESET_SUPPORT_W_REASON
SSREQ_QMI_RES_MODEM_CONF_CHANGE
#endif
);
-------------------------------------------------------------------------------------------------------------------
6 Modem 收到 AP发送的QMI_SSCTL_SHUTDOWN_REQ_V02后的处理
ssctl_v02_ser_process_req
caseQMI_SSCTL_SHUTDOWN_REQ_V02:
qmi_csi_send_resp(req_handle, msg_id, response,
sizeof(qmi_ssctl_shutdown_resp_msg_v02));//7 其实modem内部还没有准备完毕就发送response了
sys_m_shutdown(SYS_M_QMI);
sys_m_shutdown_internal();//modem 自己内部走重启流程,但是不用errfatal的方式通知AP
rcecb_signal_name(SYS_M_SHUTDOWN);//发送SYS_M_SHUTDOWN,会触发注册了这个消息的call back 函数。
req_count =
rcevt_getcontexts_name(SYS_M_SHUTDOWN);//得到注册了SYS_M_SHUTDOWN的task的数目
orig_ack_count =
rcevt_getcount_name(SYS_M_SHUTDOWN_ACK);//得到注册了SYS_M_SHUTDOWN_ACK的task的数目
rcevt_signal_name(SYS_M_SHUTDOWN);//发送SYS_M_SHUTDOWN,会触发注册了这个signal的task运行
rcevt_wait_count_name(SYS_M_SHUTDOWN_ACK,
req_count + orig_ack_count);//等待应答。
err = qmi_csi_send_ind((qmi_sys_m_client.qmi_client_handle),QMI_SSCTL_SHUTDOWN_READY_IND_V02,&ind,sizeof(qmi_ssctl_shutdown_ind_msg_v02));
HAL_dogDisable();
qurt_exception_raise_fatal();//这个看不到代码,不知道是做什么用的,不过按理说不应走raise什么fatal
while(1){}//死循环,等待被复位

评论:
2016-02-24 10:12
功能
最新评论
- wangjing
写得太好了 - wangjing
写得太好了! - DRAM
圖面都沒辦法顯示出來好像掛點了。 - Simbr
bus至少是不是还有个subsystem? - troy
@testtest:只要ldrex-modify-strex... - gh
Linux 内核在 sparse 内存模型基础上实现了vme...
文章分类
随机文章
文章存档
- 2025年4月(5)
- 2024年2月(1)
- 2023年5月(1)
- 2022年10月(1)
- 2022年8月(1)
- 2022年6月(1)
- 2022年5月(1)
- 2022年4月(2)
- 2022年2月(2)
- 2021年12月(1)
- 2021年11月(5)
- 2021年7月(1)
- 2021年6月(1)
- 2021年5月(3)
- 2020年3月(3)
- 2020年2月(2)
- 2020年1月(3)
- 2019年12月(3)
- 2019年5月(4)
- 2019年3月(1)
- 2019年1月(3)
- 2018年12月(2)
- 2018年11月(1)
- 2018年10月(2)
- 2018年8月(1)
- 2018年6月(1)
- 2018年5月(1)
- 2018年4月(7)
- 2018年2月(4)
- 2018年1月(5)
- 2017年12月(2)
- 2017年11月(2)
- 2017年10月(1)
- 2017年9月(5)
- 2017年8月(4)
- 2017年7月(4)
- 2017年6月(3)
- 2017年5月(3)
- 2017年4月(1)
- 2017年3月(8)
- 2017年2月(6)
- 2017年1月(5)
- 2016年12月(6)
- 2016年11月(11)
- 2016年10月(9)
- 2016年9月(6)
- 2016年8月(9)
- 2016年7月(5)
- 2016年6月(8)
- 2016年5月(8)
- 2016年4月(7)
- 2016年3月(5)
- 2016年2月(5)
- 2016年1月(6)
- 2015年12月(6)
- 2015年11月(9)
- 2015年10月(9)
- 2015年9月(4)
- 2015年8月(3)
- 2015年7月(7)
- 2015年6月(3)
- 2015年5月(6)
- 2015年4月(9)
- 2015年3月(9)
- 2015年2月(6)
- 2015年1月(6)
- 2014年12月(17)
- 2014年11月(8)
- 2014年10月(9)
- 2014年9月(7)
- 2014年8月(12)
- 2014年7月(6)
- 2014年6月(6)
- 2014年5月(9)
- 2014年4月(9)
- 2014年3月(7)
- 2014年2月(3)
- 2014年1月(4)
2015-12-22 15:14