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.
21 #define LOG_TAG "RIL-DEV"
22 #include <utils/Log.h>
24 #include <hayes-ril.h>
26 int ril_device_init(struct ril_device *ril_device_p)
30 rc = ril_device_data_create(ril_device_p);
32 LOGE("Failed to create device data!");
36 rc = ril_device_power_on(ril_device_p);
38 LOGE("Failed to power on device!");
42 rc = ril_device_boot(ril_device_p);
44 LOGE("Failed to boot device!");
48 rc = ril_device_open(ril_device_p);
50 LOGE("Failed to open device!");
57 int ril_device_deinit(struct ril_device *ril_device_p)
59 ril_device_close(ril_device_p);
61 ril_device_power_off(ril_device_p);
63 ril_device_data_destroy(ril_device_p);
68 int ril_device_data_create(struct ril_device *ril_device_p)
72 if(ril_device_p->handlers == NULL) {
73 LOGE("Missing device handlers!");
77 if(ril_device_p->handlers->power == NULL) {
78 LOGE("Missing device power handlers!");
82 if(ril_device_p->handlers->power->sdata_create == NULL) {
83 LOGE("Missing device power data handlers!");
87 LOGD("Creating data for power handlers...");
88 rc = ril_device_p->handlers->power->sdata_create(&ril_device_p->handlers->power->sdata);
90 LOGE("Creating data for power handlers failed!");
94 if(ril_device_p->handlers->transport == NULL) {
95 LOGE("Missing device transport handlers!");
99 if(ril_device_p->handlers->transport->sdata_create == NULL) {
100 LOGE("Missing device transport data handlers!");
104 LOGD("Creating data for transport handlers...");
105 ril_device_p->handlers->transport->sdata_create(&ril_device_p->handlers->transport->sdata);
107 LOGE("Creating data for transport handlers failed!");
111 LOGD("Creating mutex for transport handlers...");
112 pthread_mutex_init(&(ril_device_p->handlers->transport->mutex), NULL);
117 int ril_device_data_destroy(struct ril_device *ril_device_p)
121 if(ril_device_p->handlers == NULL) {
122 LOGE("Missing device handlers!");
126 if(ril_device_p->handlers->power == NULL) {
127 LOGE("Missing device power handlers!");
131 if(ril_device_p->handlers->power->sdata_destroy == NULL) {
132 LOGE("Missing device power data handlers!");
136 LOGD("Destroying data for power handlers...");
137 rc = ril_device_p->handlers->power->sdata_destroy(&ril_device_p->handlers->power->sdata);
139 LOGE("Destroying data for power handlers failed!");
143 if(ril_device_p->handlers->transport == NULL) {
144 LOGE("Missing device transport handlers!");
148 if(ril_device_p->handlers->transport->sdata_destroy == NULL) {
149 LOGE("Missing device transport data handlers!");
153 LOGD("Destroying data for transport handlers...");
154 ril_device_p->handlers->transport->sdata_destroy(&ril_device_p->handlers->transport->sdata);
156 LOGE("Destroying data for transport handlers failed!");
160 LOGD("Destroying mutex for transport handlers...");
161 pthread_mutex_destroy(&(ril_device_p->handlers->transport->mutex));
166 int ril_device_boot(struct ril_device *ril_device_p)
170 if(ril_device_p->handlers == NULL) {
171 LOGE("Missing device handlers!");
175 if(ril_device_p->handlers->power == NULL) {
176 LOGE("Missing device power handlers!");
180 if(ril_device_p->handlers->power->boot == NULL) {
181 LOGE("Missing device power boot handler!");
185 LOGD("Booting modem...");
187 rc = ril_device_p->handlers->power->boot(ril_device_p->handlers->power->sdata);
191 int ril_device_power_on(struct ril_device *ril_device_p)
195 if(ril_device_p->handlers == NULL) {
196 LOGE("Missing device handlers!");
200 if(ril_device_p->handlers->power == NULL) {
201 LOGE("Missing device power handlers!");
205 if(ril_device_p->handlers->power->power_on == NULL) {
206 LOGE("Missing device power on handler!");
210 LOGD("Powering modem on...");
212 rc = ril_device_p->handlers->power->power_on(ril_device_p->handlers->power->sdata);
216 int ril_device_power_off(struct ril_device *ril_device_p)
220 if(ril_device_p->handlers == NULL) {
221 LOGE("Missing device handlers!");
225 if(ril_device_p->handlers->power == NULL) {
226 LOGE("Missing device power handlers!");
230 if(ril_device_p->handlers->power->power_off == NULL) {
231 LOGE("Missing device power off handler!");
235 LOGD("Powering modem off...");
237 rc = ril_device_p->handlers->power->power_off(ril_device_p->handlers->power->sdata);
241 int ril_device_open(struct ril_device *ril_device_p)
245 if(ril_device_p->handlers == NULL) {
246 LOGE("Missing device handlers!");
250 if(ril_device_p->handlers->transport == NULL) {
251 LOGE("Missing device transport handlers!");
255 if(ril_device_p->handlers->transport->open == NULL) {
256 LOGE("Missing device transport open handler!");
260 LOGD("Opening modem...");
262 rc = ril_device_p->handlers->transport->open(ril_device_p->handlers->transport->sdata);
266 int ril_device_close(struct ril_device *ril_device_p)
270 if(ril_device_p->handlers == NULL) {
271 LOGE("Missing device handlers!");
275 if(ril_device_p->handlers->transport == NULL) {
276 LOGE("Missing device transport handlers!");
280 if(ril_device_p->handlers->transport->close == NULL) {
281 LOGE("Missing device transport close handler!");
285 LOGD("Closing modem...");
287 rc = ril_device_p->handlers->transport->close(ril_device_p->handlers->transport->sdata);
291 int ril_device_send(struct ril_device *ril_device_p, void *data, int length)
295 if(ril_device_p->handlers == NULL) {
296 LOGE("Missing device handlers!");
300 if(ril_device_p->handlers->transport == NULL) {
301 LOGE("Missing device transport handlers!");
305 if(ril_device_p->handlers->transport->send == NULL) {
306 LOGE("Missing device transport send handler!");
310 RIL_DEVICE_LOCK(ril_device_p);
311 rc = ril_device_p->handlers->transport->send(ril_device_p->handlers->transport->sdata, data, length);
312 RIL_DEVICE_UNLOCK(ril_device_p);
317 int ril_device_recv(struct ril_device *ril_device_p, void **data, int length)
321 if(ril_device_p->handlers == NULL) {
322 LOGE("Missing device handlers!");
326 if(ril_device_p->handlers->transport == NULL) {
327 LOGE("Missing device transport handlers!");
331 if(ril_device_p->handlers->transport->recv == NULL) {
332 LOGE("Missing device transport recv handler!");
336 RIL_DEVICE_LOCK(ril_device_p);
337 rc = ril_device_p->handlers->transport->recv(ril_device_p->handlers->transport->sdata, data, length);
338 RIL_DEVICE_UNLOCK(ril_device_p);
343 int ril_device_recv_poll(struct ril_device *ril_device_p)
347 if(ril_device_p->handlers == NULL) {
348 LOGE("Missing device handlers!");
352 if(ril_device_p->handlers->transport == NULL) {
353 LOGE("Missing device transport handlers!");
357 if(ril_device_p->handlers->transport->recv_poll == NULL) {
358 LOGE("Missing device transport recv poll handler!");
362 rc = ril_device_p->handlers->transport->recv_poll(ril_device_p->handlers->transport->sdata);
366 int ril_device_recv_loop(struct ril_device *ril_device_p)
368 struct at_response **responses = NULL;
369 int responses_count = 0;
376 // Return error after 5 consecutive poll/read failures
377 for(i=5 ; i > 0 ; i--) {
379 rc = ril_device_recv_poll(ril_device_p);
381 LOGE("Polling from transport recv failed!");
387 rc = ril_device_recv(ril_device_p, &data, length);
389 LOGE("Reading from transport recv failed!");
399 LOGD("Read: %d bytes", length);
401 responses_count = at_responses_process(&responses, data, length);
402 LOGD("Converted to %d AT structures", responses_count);
406 //TODO: Dispatch AT structures with multi-message handling (dispatch each)
408 at_responses_dump(responses, responses_count);
409 at_responses_free(responses, responses_count);
412 // When poll/read failed, close and reopen the device
413 ril_device_close(ril_device_p);
415 ril_device_open(ril_device_p);
417 RIL_DEVICE_UNLOCK(ril_device_p);
423 void *ril_device_recv_thread(void *data)
425 struct ril_device *ril_device_p = (struct ril_device *) data;
429 for(i = 5 ; i > 0 ; i--) {
430 rc = ril_device_recv_loop(ril_device_p);
432 LOGE("Recv loop failed too many times, restarting...");
434 rc = ril_device_deinit(ril_device_p);
440 rc = ril_device_init(ril_device_p);
446 LOGE("Recv thread failed too many times, stopping it all...");
447 ril_device_deinit(ril_device_p);
452 int ril_device_recv_thread_start(struct ril_device *ril_device_p)
457 if(ril_device_p->handlers == NULL) {
458 LOGE("Missing device handlers!");
462 if(ril_device_p->handlers->transport == NULL) {
463 LOGE("Missing device transport handlers!");
467 pthread_attr_init(&attr);
468 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
470 rc = pthread_create(&(ril_device_p->handlers->transport->recv_thread), &attr, ril_device_recv_thread, (void *) ril_device_p);
472 LOGE("Creating transport recv thread failed!");