diff options
author | Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> | 2017-09-06 00:19:36 +0200 |
---|---|---|
committer | Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> | 2017-09-06 00:19:36 +0200 |
commit | f35a9bbd1ebb52433f313c675fbe01bb1ca96d7d (patch) | |
tree | c1aff224fd4a2ea2e5e06805c7caff5406b0ab42 /power.c | |
parent | 06cf4fe68ad096961b4b9c653ba2bc31d270f009 (diff) | |
download | i9305_modem-master.zip i9305_modem-master.tar.gz i9305_modem-master.tar.bz2 |
The RIL uses libqmi. qmicli and ModemManager were used as
references for using libqmi. The request processing is modelled after
Samsung-RIL and a lot of code could be reused for QMI-RIL.
Establishing a data connection succeeds and mobile data is working
in early testing. However, there is not yet a routine for handling
interruptions and notifying Android about them. Information about the
serving network including signal strength are retrieved and an
unlocked SIM card is recognized. Reading data from the SIM and
requesting the usual device information should work as well. Support
for voice calls and SMS is completely missing at this point.
Signed-off-by: Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de>
Diffstat (limited to 'power.c')
-rw-r--r-- | power.c | 147 |
1 files changed, 147 insertions, 0 deletions
@@ -0,0 +1,147 @@ +/* + * This file is part of QMI-RIL. + * + * Copyright (C) 2017 Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> + * + * QMI-RIL is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * QMI-RIL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with QMI-RIL. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <stdlib.h> + +#define LOG_TAG "RIL" +#include <utils/Log.h> + +#include <qmi-ril.h> + +void dms_event_report_indication_cb(QmiClientDms *client, + QmiIndicationDmsEventReportOutput *output) +{ + QmiDmsOperatingMode mode; + + qmi_indication_dms_event_report_output_get_operating_mode( + output, &mode, NULL); + + RIL_LOGD("Got operating mode indication:\n" + "\tMode: '%s'", qmi_dms_operating_mode_get_string(mode)); + + switch (mode) { + case QMI_DMS_OPERATING_MODE_LOW_POWER: + RIL_LOGD("Power state is low power mode"); + ril_radio_state_update(RADIO_STATE_OFF); + break; + case QMI_DMS_OPERATING_MODE_SHUTTING_DOWN: + RIL_LOGD("Power: device is in the process of shutting down"); + ril_radio_state_update(RADIO_STATE_OFF); + break; + case QMI_DMS_OPERATING_MODE_ONLINE: + RIL_LOGD("Power state is normal"); + ril_radio_state_update(RADIO_STATE_SIM_NOT_READY); + break; + default: + RIL_LOGE("Unknown power state"); + } +} + +static void +set_operating_mode_ready(QmiClientDms *client, GAsyncResult *res, + RIL_Token token) +{ + QmiMessageDmsSetOperatingModeOutput *output; + GError *error = NULL; + + output = qmi_client_dms_set_operating_mode_finish(client, res, + &error); + if (!output) { + RIL_LOGE("%s: error: operation failed: %s", __func__, + error->message); + goto error; + } + + if (!qmi_message_dms_set_operating_mode_output_get_result( + output, &error)) { + RIL_LOGE("error: couldn't set operating mode: %s", + error->message); + goto error; + } + + RIL_LOGD("Operating mode set successfully"); + + ril_request_complete(token, RIL_E_SUCCESS, NULL, 0); + goto complete; + +error: + ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); + +complete: + if (error) + g_error_free(error); + if (output) + qmi_message_dms_set_operating_mode_output_unref(output); +} + +int ril_request_radio_power(void *data, size_t size, RIL_Token token) +{ + struct ril_request *request; + int power_state; + QmiMessageDmsSetOperatingModeInput *input = NULL; + QmiDmsOperatingMode mode; + GError *error = NULL; + int rc; + + if (data == NULL || size < sizeof(power_state)) + goto error; + + request = ril_request_find_request_status(RIL_REQUEST_RADIO_POWER, RIL_REQUEST_HANDLED); + if (request != NULL) + return RIL_REQUEST_UNHANDLED; + + power_state = *((int *)data); + + if (power_state > 0) { + RIL_LOGD("Requesting normal power state"); + mode = QMI_DMS_OPERATING_MODE_ONLINE; + } else { + RIL_LOGD("Requesting low power mode power state"); + mode = QMI_DMS_OPERATING_MODE_LOW_POWER; + } + + input = qmi_message_dms_set_operating_mode_input_new(); + if (!qmi_message_dms_set_operating_mode_input_set_mode( + input, mode, &error)) { + RIL_LOGE("error: couldn't create input data bundle: '%s'", + error->message); + goto error; + } + + qmi_client_dms_set_operating_mode(ctx->DmsClient, input, 10, + ctx->cancellable, + (GAsyncReadyCallback)set_operating_mode_ready, + token); + + rc = RIL_REQUEST_HANDLED; + goto complete; + +error: + ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); + + rc = RIL_REQUEST_COMPLETED; + +complete: + if (error) + g_error_free(error); + if (input) + qmi_message_dms_set_operating_mode_input_unref(input); + + return rc; +} |