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 解决方案

实现该接口,该问题解决。

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐