telephony休眠失败的问题
1关键字 OpenHarmony 3.2 Release;熄屏;使能;vendor;telephony;modem;休眠 2 问题描述 2.1 运行环境 系统版本:OpenHarmony-3.2.3-Release(已该版本为基线) 应用软件:modem适配so库,展锐mo
1关键字
OpenHarmony 3.2 Release;熄屏;使能;vendor;telephony;modem;休眠
2 问题描述
2.1 运行环境
-
系统版本:OpenHarmony-3.2.3-Release(已该版本为基线)
-
应用软件:modem适配so库,modem闭源库
2.2 问题现象
熄屏时,熄屏时,电话模块telephony进程没有休眠。
2.3 测试步骤
1.开发板插入sim卡
2.开发板开机,按电源键,点亮屏幕
3.按电源键,熄屏
3 问题原因
熄屏时,telephony进程没有休眠
查看休眠的命令
power-shell dump -r
disable=1表示已经休眠
值为0,表示没有休眠
下图中,telRilAckRunningLock的值为0,表示持有电源锁,所以没有休眠。
电源锁计数是配对的,如下
1.telephony下发AT请求时,申请电源锁,电源锁计数加1。
2.AT请求执行完成,返回执行结果。
3.telephony收到AT请求的回复,电源锁计数减1。
正常情况下,电源锁计数应该为0。
期望:
熄屏时,电源锁计数为0时,telephony能正常休眠。
实际:
熄屏时,电源锁计数不为0,telephony不能正常休眠。
4 定位过程
熄屏流程如下
电源熄屏--->电源模块发起休眠命令--->电源模块查询tele模块是否持有电源锁--->如果不持有电源锁(电源锁计数为0)--->tele进入休眠
--->如果持有电源锁(电源计数不为0)--->tele不进入休眠(等待电源锁计数为0,等待释放电源锁)
4.1 创建电源锁
在OnInit中创建电源锁
void TelRilHandler::OnInit(void)
{
auto &powerMgrClient = PowerMgr::PowerMgrClient::GetInstance();
ackRunningLock_ =
powerMgrClient.CreateRunningLock("telRilAckRunningLock", PowerMgr::RunningLockType::RUNNINGLOCK_BACKGROUND);
reqRunningLock_ = powerMgrClient.CreateRunningLock(
"telRilRequestRunningLock", PowerMgr::RunningLockType::RUNNINGLOCK_BACKGROUND);
reqRunningLockCount_ = 0;
reqLockSerialNum_ = 0;
ackLockSerialNum_ = 0;
}
4.2 电源锁加
上层下发AT请求时,会申请电源锁,电源锁计数加1。
4.2 电源锁减
vendor层返回AT请求的结果时,释放电源锁,电源锁计数减1。
5. 分析
分析日志
电源锁计数为3,说明有3个请求没有收到回应,导致电源锁没有释放。
查询下发去请求,一共下发了222个请求
查询收到的回应,一共收到219个回应
所以电源锁计数为3,222-219=3。
电源锁计数不为0,telephony一直持有电源锁,没有释放电源锁,导致无法休眠。
检查下发的请求,和收到的回应,发现有1个请求vendor没有实现。
原因:ReqSetLocateUpdates接口没有实现。该请求一共下发3次。
上层下发ReqSetLocateUpdates请求,计数器加1。但底层没有实现该接口,就没有返回该接口的回应消息,导致计数器没有减1。
414 HREQ_NETWORK_SET_LOCATE_UPDATES ----> RIL_REQUEST_SET_LOCATION_UPDATES 76
ReqSetLocateUpdates接口没有实现
void ReqSetLocateUpdates(const ReqDataInfo *requestInfo, HRilRegNotifyMode mode)
{
// if (requestInfo == NULL) {
// return;
// }
// ResponseInfo *responseInfo = NULL;
// char *cmd = NULL;
// if (mode == REG_NOTIFY_STAT_LAC_CELLID) {
// cmd = "AT+CREG=2";
// } else if (mode == REG_NOTIFY_STAT_ONLY) {
// cmd = "AT+CREG=1";
// } else {
// struct ReportInfo reportInfo = CreateReportInfo(requestInfo, HRIL_ERR_INVALID_PARAMETER, HRIL_RESPONSE, 0);
// OnNetworkReport(requestInfo->slotId, reportInfo, NULL, 0);
// TELEPHONY_LOGE("ReqSetLocateUpdates: locateUpdateMode > 1");
// return;
// }
// int32_t err = SendCommandLock(cmd, NULL, DEFAULT_TIMEOUT, &responseInfo);
// if (responseInfo == NULL) {
// struct ReportInfo reportInfo = CreateReportInfo(requestInfo, HRIL_ERR_GENERIC_FAILURE, HRIL_RESPONSE, 0);
// OnNetworkReport(requestInfo->slotId, reportInfo, NULL, 0);
// TELEPHONY_LOGE("ReqSetLocateUpdates responseInfo == NULL");
// return;
// }
// TELEPHONY_LOGD("ReqSetLocateUpdates, responseInfo->success = %{public}d", responseInfo->success);
// if (err != 0 || responseInfo->success == 0) {
// err = GetResponseErrorCode(responseInfo);
// TELEPHONY_LOGE("ReqSetLocateUpdates errcode = %{public}d", err);
// }
// struct ReportInfo reportInfo = CreateReportInfo(requestInfo, err, HRIL_RESPONSE, 0);
// OnNetworkReport(requestInfo->slotId, reportInfo, NULL, 0);
// FreeResponseInfo(responseInfo);
}
5 解决方案
实现该接口,该问题解决。
更多推荐
所有评论(0)