2 * This file is part of hayes-ril.
4 * Copyright (C) 2012 Paul Kocialkowski <contact@paulk.fr>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include <utils/Log.h>
21 #include <telephony/ril.h>
23 #include <hayes-ril.h>
25 #define RIL_VERSION_STRING "Hayes RIL"
27 struct ril_device *ril_device;
28 struct ril_globals ril_globals;
30 struct ril_dispatch_unsol ril_dispatch_unsol[] = {
31 { "AT+CREG", at_creg_unexpect },
32 { "NO CARRIER", no_carrier_unexpect },
33 { "AT+CRING", at_cring }
36 void ril_on_request(int request, void *data, size_t length, RIL_Token t)
40 case RIL_REQUEST_RADIO_POWER:
41 ril_request_radio_power(t, data, length);
44 case RIL_REQUEST_GET_SIM_STATUS:
45 ril_request_get_sim_status(t, data, length);
47 case RIL_REQUEST_ENTER_SIM_PIN:
48 ril_request_enter_sim_pin(t, data, length);
50 case RIL_REQUEST_SIM_IO:
51 ril_request_sim_io(t, data, length);
54 case RIL_REQUEST_SIGNAL_STRENGTH:
55 ril_request_signal_strength(t, data, length);
57 case RIL_REQUEST_REGISTRATION_STATE:
58 ril_request_registration_state(t, data, length);
60 case RIL_REQUEST_OPERATOR:
61 ril_request_operator(t, data, length);
64 case RIL_REQUEST_GET_CURRENT_CALLS:
65 ril_request_get_current_calls(t, data, length);
67 case RIL_REQUEST_DIAL:
68 ril_request_dial(t, data, length);
70 case RIL_REQUEST_ANSWER:
71 ril_request_anwswer(t, data, length);
73 case RIL_REQUEST_HANGUP:
74 ril_request_hangup(t, data, length);
76 case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND:
77 ril_request_hangup_waiting_or_background(t, data, length);
79 case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND:
80 ril_request_hangup_foreground_resume_background(t, data, length);
82 case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE:
83 ril_request_switch_waiting_or_holding_and_active(t, data, length);
86 LOGE("Request not implemented: %d\n", request);
87 RIL_onRequestComplete(t, RIL_E_REQUEST_NOT_SUPPORTED, NULL, 0);
92 const char *ril_get_version(void)
94 return RIL_VERSION_STRING;
97 RIL_RadioState ril_on_state_request(void)
99 LOGD("State request");
100 return ril_globals.radio_state;
103 int ril_on_supports(int requestCode)
108 void ril_on_cancel(RIL_Token t)
113 static const RIL_RadioFunctions ril_ops = {
116 ril_on_state_request,
122 void *ril_dispatch(void *data)
124 struct at_response *response = NULL;
128 for(i = 5 ; i > 0 ; i--) {
130 response = at_response_dequeue();
139 rc = at_async_response_dequeue(response);
142 if(response->command == NULL) {
143 at_response_free(response);
147 for(j=0 ; j < ril_globals.dispatch_unsol_count ; j++) {
148 if(at_commands_compare(response->command, ril_globals.dispatch_unsol[j].command) && ril_globals.dispatch_unsol[j].func != NULL) {
149 ril_globals.dispatch_unsol[j].func(response);
154 at_response_free(response);
157 LOGE("RIL dispatch failed, retrying!");
160 LOGE("RIL dispatch failed too many times, aborting");
165 int ril_dispatch_thread_start(void)
170 pthread_attr_init(&attr);
171 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
173 rc = pthread_create(&ril_globals.dispatch_thread, &attr, ril_dispatch, NULL);
175 LOGE("Creating dispatch thread failed!");
182 void ril_globals_init(void)
184 memset(&ril_globals, 0, sizeof(struct ril_globals));
185 ril_globals.dispatch_unsol = &ril_dispatch_unsol;
186 ril_globals.dispatch_unsol_count = sizeof(ril_dispatch_unsol) / sizeof(struct ril_dispatch_unsol);
188 LOGE("Registered %d unsol requests handlers", ril_globals.dispatch_unsol_count);
190 ril_globals.radio_state = RADIO_STATE_OFF;
195 const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)
200 ril_device_register(&ril_device);
202 LOGD("Starting %s for device: %s", RIL_VERSION_STRING, ril_device->name);
204 rc = ril_device_init(ril_device);
206 LOGE("Failed to init device!");
207 ril_device_deinit(ril_device);
212 rc = ril_device_transport_recv_thread_start(ril_device);
214 LOGE("Failed to start device recv thread!");
215 ril_device_deinit(ril_device);
220 rc = ril_dispatch_thread_start();
222 LOGE("Failed to start dispatch thread!");
223 ril_device_deinit(ril_device);
228 LOGD("Initialization complete");