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>
30 int ril_device_init(struct ril_device *ril_device_p)
34 rc = ril_device_data_create(ril_device_p);
36 LOGE("Failed to create device data!");
40 rc = ril_device_power_on(ril_device_p);
42 LOGE("Failed to power on device!");
46 rc = ril_device_power_boot(ril_device_p);
48 LOGE("Failed to boot device!");
52 rc = ril_device_transport_open(ril_device_p);
54 LOGE("Failed to open device!");
61 int ril_device_setup(struct ril_device *ril_device_p)
65 rc = ril_device_at_setup(ril_device_p);
67 LOGE("Failed to setup device!");
74 int ril_device_deinit(struct ril_device *ril_device_p)
76 ril_device_transport_close(ril_device_p);
78 ril_device_power_off(ril_device_p);
80 ril_device_data_destroy(ril_device_p);
85 int ril_device_data_create(struct ril_device *ril_device_p)
89 if(ril_device_p->handlers == NULL) {
90 LOGE("Missing device handlers!");
94 if(ril_device_p->handlers->power == NULL) {
95 LOGE("Missing device power handlers!");
99 if(ril_device_p->handlers->power->sdata_create == NULL) {
100 LOGE("Missing device power data handlers!");
104 LOGD("Creating data for power handlers...");
105 rc = ril_device_p->handlers->power->sdata_create(&ril_device_p->handlers->power->sdata);
107 LOGE("Creating data for power handlers failed!");
111 if(ril_device_p->handlers->transport == NULL) {
112 LOGE("Missing device transport handlers!");
116 if(ril_device_p->handlers->transport->sdata_create == NULL) {
117 LOGE("Missing device transport data handlers!");
121 LOGD("Creating data for transport handlers...");
122 ril_device_p->handlers->transport->sdata_create(&ril_device_p->handlers->transport->sdata);
124 LOGE("Creating data for transport handlers failed!");
128 LOGD("Creating mutex for transport handlers...");
129 pthread_mutex_init(&(ril_device_p->handlers->transport->mutex), NULL);
131 // Missing AT handlers is not fatal
132 if(ril_device_p->handlers->at == NULL) {
133 LOGE("Missing device AT handlers!");
137 if(ril_device_p->handlers->at->sdata_create == NULL) {
138 LOGE("Missing device AT data handlers!");
142 LOGD("Creating data for AT handlers...");
143 ril_device_p->handlers->at->sdata_create(&ril_device_p->handlers->at->sdata);
145 LOGE("Creating data for AT handlers failed!");
152 int ril_device_data_destroy(struct ril_device *ril_device_p)
156 if(ril_device_p->handlers == NULL) {
157 LOGE("Missing device handlers!");
161 if(ril_device_p->handlers->power == NULL) {
162 LOGE("Missing device power handlers!");
166 if(ril_device_p->handlers->power->sdata_destroy == NULL) {
167 LOGE("Missing device power data handlers!");
171 LOGD("Destroying data for power handlers...");
172 rc = ril_device_p->handlers->power->sdata_destroy(ril_device_p->handlers->power->sdata);
174 LOGE("Destroying data for power handlers failed!");
178 if(ril_device_p->handlers->transport == NULL) {
179 LOGE("Missing device transport handlers!");
183 if(ril_device_p->handlers->transport->sdata_destroy == NULL) {
184 LOGE("Missing device transport data handlers!");
188 LOGD("Destroying data for transport handlers...");
189 ril_device_p->handlers->transport->sdata_destroy(ril_device_p->handlers->transport->sdata);
191 LOGE("Destroying data for transport handlers failed!");
195 LOGD("Destroying mutex for transport handlers...");
196 pthread_mutex_destroy(&(ril_device_p->handlers->transport->mutex));
198 // Missing AT handlers is not fatal
199 if(ril_device_p->handlers->at == NULL) {
200 LOGE("Missing device AT handlers!");
204 if(ril_device_p->handlers->at->sdata_create == NULL) {
205 LOGE("Missing device AT data handlers!");
209 LOGD("Creating data for AT handlers...");
210 ril_device_p->handlers->at->sdata_destroy(ril_device_p->handlers->at->sdata);
212 LOGE("Destroying data for AT handlers failed!");
223 int ril_device_power_on(struct ril_device *ril_device_p)
227 if(ril_device_p->handlers == NULL) {
228 LOGE("Missing device handlers!");
232 if(ril_device_p->handlers->power == NULL) {
233 LOGE("Missing device power handlers!");
237 if(ril_device_p->handlers->power->power_on == NULL) {
238 LOGE("Missing device power on handler!");
242 LOGD("Powering modem on...");
244 rc = ril_device_p->handlers->power->power_on(ril_device_p->handlers->power->sdata);
248 int ril_device_power_off(struct ril_device *ril_device_p)
252 if(ril_device_p->handlers == NULL) {
253 LOGE("Missing device handlers!");
257 if(ril_device_p->handlers->power == NULL) {
258 LOGE("Missing device power handlers!");
262 if(ril_device_p->handlers->power->power_off == NULL) {
263 LOGE("Missing device power off handler!");
267 LOGD("Powering modem off...");
269 rc = ril_device_p->handlers->power->power_off(ril_device_p->handlers->power->sdata);
273 int ril_device_power_boot(struct ril_device *ril_device_p)
277 if(ril_device_p->handlers == NULL) {
278 LOGE("Missing device handlers!");
282 if(ril_device_p->handlers->power == NULL) {
283 LOGE("Missing device power handlers!");
287 if(ril_device_p->handlers->power->boot == NULL) {
288 LOGE("Missing device power boot handler!");
292 LOGD("Booting modem...");
294 rc = ril_device_p->handlers->power->boot(ril_device_p->handlers->power->sdata);
303 int ril_device_transport_open(struct ril_device *ril_device_p)
307 if(ril_device_p->handlers == NULL) {
308 LOGE("Missing device handlers!");
312 if(ril_device_p->handlers->transport == NULL) {
313 LOGE("Missing device transport handlers!");
317 if(ril_device_p->handlers->transport->open == NULL) {
318 LOGE("Missing device transport open handler!");
322 LOGD("Opening modem...");
324 rc = ril_device_p->handlers->transport->open(ril_device_p->handlers->transport->sdata);
328 int ril_device_transport_close(struct ril_device *ril_device_p)
332 if(ril_device_p->handlers == NULL) {
333 LOGE("Missing device handlers!");
337 if(ril_device_p->handlers->transport == NULL) {
338 LOGE("Missing device transport handlers!");
342 if(ril_device_p->handlers->transport->close == NULL) {
343 LOGE("Missing device transport close handler!");
347 LOGD("Closing modem...");
349 rc = ril_device_p->handlers->transport->close(ril_device_p->handlers->transport->sdata);
353 int ril_device_transport_send(struct ril_device *ril_device_p, void *data, int length)
357 if(ril_device_p->handlers == NULL) {
358 LOGE("Missing device handlers!");
362 if(ril_device_p->handlers->transport == NULL) {
363 LOGE("Missing device transport handlers!");
367 if(ril_device_p->handlers->transport->send == NULL) {
368 LOGE("Missing device transport send handler!");
372 RIL_DEVICE_LOCK(ril_device_p);
373 rc = ril_device_p->handlers->transport->send(ril_device_p->handlers->transport->sdata, data, length);
374 RIL_DEVICE_UNLOCK(ril_device_p);
379 int ril_device_transport_recv(struct ril_device *ril_device_p, void **data, int length)
383 if(ril_device_p->handlers == NULL) {
384 LOGE("Missing device handlers!");
388 if(ril_device_p->handlers->transport == NULL) {
389 LOGE("Missing device transport handlers!");
393 if(ril_device_p->handlers->transport->recv == NULL) {
394 LOGE("Missing device transport recv handler!");
398 RIL_DEVICE_LOCK(ril_device_p);
399 rc = ril_device_p->handlers->transport->recv(ril_device_p->handlers->transport->sdata, data, length);
400 RIL_DEVICE_UNLOCK(ril_device_p);
405 int ril_device_transport_recv_poll(struct ril_device *ril_device_p)
409 if(ril_device_p->handlers == NULL) {
410 LOGE("Missing device handlers!");
414 if(ril_device_p->handlers->transport == NULL) {
415 LOGE("Missing device transport handlers!");
419 if(ril_device_p->handlers->transport->recv_poll == NULL) {
420 LOGE("Missing device transport recv poll handler!");
424 rc = ril_device_p->handlers->transport->recv_poll(ril_device_p->handlers->transport->sdata);
428 int ril_device_transport_recv_loop(struct ril_device *ril_device_p)
430 struct at_response **responses = NULL;
431 int responses_count = 0;
432 int responses_queued = 0;
439 // Return error after 5 consecutive poll/read failures
440 for(i=5 ; i > 0 ; i--) {
442 rc = ril_device_transport_recv_poll(ril_device_p);
444 LOGE("Polling from transport recv failed!");
450 rc = ril_device_transport_recv(ril_device_p, &data, length);
451 if(rc <= 0 || data == NULL) {
452 LOGE("Reading from transport recv failed!");
462 responses_count = at_responses_process(&responses, data, length);
463 responses_queued = 0;
467 ril_data_log(data, length);
470 // Good way to give the recv loop some sleep: call at_send_expect_status
471 for(j=0 ; j < responses_count ; j++) {
474 ril_recv_log(responses[j]);
478 rc = at_sync_response_dequeue(responses[j]);
480 rc = at_response_queue(responses[j]);
482 LOGE("Failed to queue response, clearing!");
483 at_response_free(responses[j]);
485 responses_queued = 1;
490 // Unlock the queue after adding all the requests to the queue (if any)
492 at_responses_queue_unlock();
497 // When poll/read failed, close and reopen the device
498 ril_device_transport_close(ril_device_p);
500 ril_device_transport_open(ril_device_p);
502 RIL_DEVICE_UNLOCK(ril_device_p);
508 void *ril_device_transport_recv_thread(void *data)
510 struct ril_device *ril_device_p = (struct ril_device *) data;
514 for(i = 5 ; i > 0 ; i--) {
515 rc = ril_device_transport_recv_loop(ril_device_p);
517 LOGE("Recv loop failed too many times, restarting...");
519 rc = ril_device_deinit(ril_device_p);
525 rc = ril_device_init(ril_device_p);
531 LOGE("Recv thread failed too many times, stopping it all...");
532 ril_device_deinit(ril_device_p);
537 int ril_device_transport_recv_thread_start(struct ril_device *ril_device_p)
542 if(ril_device_p->handlers == NULL) {
543 LOGE("Missing device handlers!");
547 if(ril_device_p->handlers->transport == NULL) {
548 LOGE("Missing device transport handlers!");
552 pthread_attr_init(&attr);
553 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
555 rc = pthread_create(&(ril_device_p->handlers->transport->recv_thread), &attr, ril_device_transport_recv_thread, (void *) ril_device_p);
557 LOGE("Creating transport recv thread failed!");
568 int ril_device_at_power_on(struct ril_device *ril_device_p)
572 if(ril_device_p->handlers == NULL) {
573 LOGE("Missing device handlers!");
577 // Missing AT handlers is not fatal
578 if(ril_device_p->handlers->at == NULL) {
579 LOGE("Missing device AT handlers!");
583 if(ril_device_p->handlers->at->power_on == NULL) {
584 LOGE("Missing device AT power on handler!");
588 rc = ril_device_p->handlers->at->power_on(ril_device_p->handlers->at->sdata);
592 int ril_device_at_power_off(struct ril_device *ril_device_p)
596 if(ril_device_p->handlers == NULL) {
597 LOGE("Missing device handlers!");
601 // Missing AT handlers is not fatal
602 if(ril_device_p->handlers->at == NULL) {
603 LOGE("Missing device AT handlers!");
607 if(ril_device_p->handlers->at->power_off == NULL) {
608 LOGE("Missing device AT power off handler!");
612 rc = ril_device_p->handlers->at->power_off(ril_device_p->handlers->at->sdata);
616 int ril_device_at_setup(struct ril_device *ril_device_p)
623 // Echo enabled, send results, verbose enabled
624 at_send_expect_status("ATE1Q0V1", NULL);
627 at_send_expect_status("AT+CMEE=1", NULL);
629 // Detailed rings, service reporting
630 at_send_expect_status("AT+CRC=1;+CR=1", NULL);
633 at_send_expect_status("AT+CMGF=0", NULL);
635 // Network registration notifications
636 status = at_send_expect_status("AT+CREG=2", NULL);
637 if(at_status_error(status)) {
638 LOGD("Modem doesn't support AT+CREG=2");
639 at_send_expect_status("AT+CREG=1", NULL);
644 if(ril_device_p->handlers == NULL) {
645 LOGE("Missing device handlers!");
649 // Missing AT handlers is not fatal
650 if(ril_device_p->handlers->at == NULL) {
651 LOGE("Missing device AT handlers!");
655 if(ril_device_p->handlers->at->setup == NULL) {
656 LOGE("Missing device AT setup handler!");
660 rc = ril_device_p->handlers->at->setup(ril_device_p->handlers->at->sdata);