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);
59 case RIL_REQUEST_GET_CURRENT_CALLS:
60 ril_request_get_current_calls(t, data, length);
63 LOGE("Request not implemented: %d\n", request);
64 RIL_onRequestComplete(t, RIL_E_REQUEST_NOT_SUPPORTED, NULL, 0);
69 const char *ril_get_version(void)
71 return RIL_VERSION_STRING;
74 RIL_RadioState ril_on_state_request(void)
76 LOGD("State request");
77 return ril_globals.radio_state;
80 int ril_on_supports(int requestCode)
85 void ril_on_cancel(RIL_Token t)
90 static const RIL_RadioFunctions ril_ops = {
99 void *ril_dispatch(void *data)
101 struct at_response *response = NULL;
105 for(i = 5 ; i > 0 ; i--) {
107 response = at_response_dequeue();
116 rc = at_async_response_dequeue(response);
119 if(response->command == NULL) {
120 at_response_free(response);
124 for(j=0 ; j < ril_globals.dispatch_unsol_count ; j++) {
125 if(at_commands_compare(response->command, ril_globals.dispatch_unsol[j].command) && ril_globals.dispatch_unsol[j].func != NULL) {
126 ril_globals.dispatch_unsol[j].func(response);
131 at_response_free(response);
134 LOGE("RIL dispatch failed, retrying!");
137 LOGE("RIL dispatch failed too many times, aborting");
142 int ril_dispatch_thread_start(void)
147 pthread_attr_init(&attr);
148 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
150 rc = pthread_create(&ril_globals.dispatch_thread, &attr, ril_dispatch, NULL);
152 LOGE("Creating dispatch thread failed!");
159 void ril_globals_init(void)
161 memset(&ril_globals, 0, sizeof(struct ril_globals));
162 ril_globals.dispatch_unsol = &ril_dispatch_unsol;
163 ril_globals.dispatch_unsol_count = sizeof(ril_dispatch_unsol) / sizeof(struct ril_dispatch_unsol);
165 LOGE("Registered %d unsol requests handlers", ril_globals.dispatch_unsol_count);
167 ril_globals.radio_state = RADIO_STATE_OFF;
172 const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)
177 ril_device_register(&ril_device);
179 LOGD("Starting %s for device: %s", RIL_VERSION_STRING, ril_device->name);
181 rc = ril_device_init(ril_device);
183 LOGE("Failed to init device!");
184 ril_device_deinit(ril_device);
189 rc = ril_device_recv_thread_start(ril_device);
191 LOGE("Failed to start device thread!");
192 ril_device_deinit(ril_device);
197 rc = ril_dispatch_thread_start();
199 LOGE("Failed to start dispatch thread!");
200 ril_device_deinit(ril_device);
205 LOGD("Initialization complete");