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 }
34 void ril_on_request(int request, void *data, size_t length, RIL_Token t)
38 case RIL_REQUEST_RADIO_POWER:
39 ril_request_radio_power(t, data, length);
42 case RIL_REQUEST_GET_SIM_STATUS:
43 ril_request_get_sim_status(t, data, length);
45 case RIL_REQUEST_ENTER_SIM_PIN:
46 ril_request_enter_sim_pin(t, data, length);
48 case RIL_REQUEST_SIM_IO:
49 ril_request_sim_io(t, data, length);
52 case RIL_REQUEST_SIGNAL_STRENGTH:
53 ril_request_signal_strength(t, data, length);
55 case RIL_REQUEST_REGISTRATION_STATE:
56 ril_request_registration_state(t, data, length);
58 case RIL_REQUEST_OPERATOR:
59 ril_request_operator(t, data, length);
62 case RIL_REQUEST_GET_CURRENT_CALLS:
63 ril_request_get_current_calls(t, data, length);
66 LOGE("Request not implemented: %d\n", request);
67 RIL_onRequestComplete(t, RIL_E_REQUEST_NOT_SUPPORTED, NULL, 0);
72 const char *ril_get_version(void)
74 return RIL_VERSION_STRING;
77 RIL_RadioState ril_on_state_request(void)
79 LOGD("State request");
80 return ril_globals.radio_state;
83 int ril_on_supports(int requestCode)
88 void ril_on_cancel(RIL_Token t)
93 static const RIL_RadioFunctions ril_ops = {
102 void *ril_dispatch(void *data)
104 struct at_response *response = NULL;
108 for(i = 5 ; i > 0 ; i--) {
110 response = at_response_dequeue();
119 rc = at_async_response_dequeue(response);
122 if(response->command == NULL) {
123 at_response_free(response);
127 for(j=0 ; j < ril_globals.dispatch_unsol_count ; j++) {
128 if(at_commands_compare(response->command, ril_globals.dispatch_unsol[j].command) && ril_globals.dispatch_unsol[j].func != NULL) {
129 ril_globals.dispatch_unsol[j].func(response);
134 at_response_free(response);
137 LOGE("RIL dispatch failed, retrying!");
140 LOGE("RIL dispatch failed too many times, aborting");
145 int ril_dispatch_thread_start(void)
150 pthread_attr_init(&attr);
151 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
153 rc = pthread_create(&ril_globals.dispatch_thread, &attr, ril_dispatch, NULL);
155 LOGE("Creating dispatch thread failed!");
162 void ril_globals_init(void)
164 memset(&ril_globals, 0, sizeof(struct ril_globals));
165 ril_globals.dispatch_unsol = &ril_dispatch_unsol;
166 ril_globals.dispatch_unsol_count = sizeof(ril_dispatch_unsol) / sizeof(struct ril_dispatch_unsol);
168 LOGE("Registered %d unsol requests handlers", ril_globals.dispatch_unsol_count);
170 ril_globals.radio_state = RADIO_STATE_OFF;
175 const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)
180 ril_device_register(&ril_device);
182 LOGD("Starting %s for device: %s", RIL_VERSION_STRING, ril_device->name);
184 rc = ril_device_init(ril_device);
186 LOGE("Failed to init device!");
187 ril_device_deinit(ril_device);
192 rc = ril_device_recv_thread_start(ril_device);
194 LOGE("Failed to start device thread!");
195 ril_device_deinit(ril_device);
200 rc = ril_dispatch_thread_start();
202 LOGE("Failed to start dispatch thread!");
203 ril_device_deinit(ril_device);
208 LOGD("Initialization complete");