2 * This file is part of samsung-ril.
4 * Copyright (C) 2010-2011 Joerie de Gram <j.de.gram@gmail.com>
5 * Copyright (C) 2011 Paul Kocialkowski <contact@oaulk.fr>
7 * samsung-ril is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * samsung-ril is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with samsung-ril. If not, see <http://www.gnu.org/licenses/>.
26 #include <utils/Log.h>
27 #include <telephony/ril.h>
29 #include "samsung-ril.h"
32 #define RIL_VERSION_STRING "Samsung RIL"
39 * - Review code with requests that produce GEN_PHONE_RES messages to use the GEN_PHONE_RES engine
42 * - find a reliable way to configure data iface
43 * - GPRS: IPC_GPRS_CALL_STATUS, LAST_DATA_CALL_FAIL_CAUSE
44 * - check data with orange non-free ril: no gprs_ip_config
45 * - data: use IPC_GPRS_CALL_STATUS with global token for possible fail or return anyway and store ip config global?
46 * - update global fail cause in global after gprs_call_status, generic error on stored token
53 struct ril_client *ipc_fmt_client;
54 struct ril_client *ipc_rfs_client;
55 struct ril_client *srs_client;
57 const struct RIL_Env *ril_env;
58 struct ril_state ril_state;
64 struct ril_request_token ril_requests_tokens[0x100];
65 int ril_request_id = 0;
67 void ril_requests_tokens_init(void)
69 memset(ril_requests_tokens, 0, sizeof(struct ril_request_token) * 0x100);
72 int ril_request_id_new(void)
75 ril_request_id %= 0x100;
76 return ril_request_id;
79 int ril_request_reg_id(RIL_Token token)
81 int id = ril_request_id_new();
83 ril_requests_tokens[id].token = token;
84 ril_requests_tokens[id].canceled = 0;
89 int ril_request_get_id(RIL_Token token)
93 for(i=0 ; i < 0x100 ; i++)
94 if(ril_requests_tokens[i].token == token)
97 // If the token isn't registered yet, register it
98 return ril_request_reg_id(token);
101 RIL_Token ril_request_get_token(int id)
103 return ril_requests_tokens[id].token;
106 int ril_request_get_canceled(RIL_Token token)
110 id = ril_request_get_id(token);
112 if(ril_requests_tokens[id].canceled > 0)
118 void ril_request_set_canceled(RIL_Token token, int canceled)
122 id = ril_request_get_id(token);
124 ril_requests_tokens[id].canceled = canceled;
127 void RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen)
129 if(!ril_request_get_canceled(t))
130 RIL_onRequestCompleteReal(t, e, response, responselen);
132 RIL_onRequestCompleteReal(t, RIL_E_CANCELLED, response, responselen);
139 void ril_tokens_check(void)
143 if(ril_state.tokens.baseband_version != 0) {
144 if(ril_state.radio_state != RADIO_STATE_OFF) {
145 t = ril_state.tokens.baseband_version;
146 ril_state.tokens.baseband_version = 0;
147 ril_request_baseband_version(t);
151 if(ril_state.tokens.get_imei != 0 && ril_state.tokens.get_imeisv != 0) {
152 if(ril_state.radio_state != RADIO_STATE_OFF) {
153 t = ril_state.tokens.get_imei;
154 ril_state.tokens.get_imei = 0;
155 ril_request_get_imei(t);
161 * Clients dispatch functions
164 void ipc_fmt_dispatch(struct ipc_message_info *info)
166 switch(IPC_COMMAND(info)) {
168 case IPC_GEN_PHONE_RES:
169 ipc_gen_phone_res(info);
172 case IPC_PWR_PHONE_PWR_UP:
173 ipc_pwr_phone_pwr_up();
175 case IPC_PWR_PHONE_STATE:
176 ipc_pwr_phone_state(info);
179 case IPC_DISP_ICON_INFO:
180 ipc_disp_icon_info(info);
182 case IPC_DISP_RSSI_INFO:
183 ipc_disp_rssi_info(info);
187 ipc_misc_me_sn(info);
189 case IPC_MISC_ME_VERSION:
190 ipc_misc_me_version(info);
192 case IPC_MISC_ME_IMSI:
193 ipc_misc_me_imsi(info);
195 case IPC_MISC_TIME_INFO:
196 ipc_misc_time_info(info);
199 case IPC_SAT_PROACTIVE_CMD:
200 respondSatProactiveCmd(info);
202 case IPC_SAT_ENVELOPE_CMD:
203 respondSatEnvelopeCmd(info);
210 case IPC_SEC_PIN_STATUS:
211 ipc_sec_pin_status(info);
213 case IPC_SEC_LOCK_INFO:
214 ipc_sec_lock_info(info);
216 case IPC_SEC_RSIM_ACCESS:
217 ipc_sec_rsim_access(info);
219 case IPC_SEC_PHONE_LOCK:
220 ipc_sec_phone_lock(info);
223 case IPC_NET_CURRENT_PLMN:
224 ipc_net_current_plmn(info);
227 ipc_net_regist(info);
229 case IPC_NET_PLMN_LIST:
230 ipc_net_plmn_list(info);
232 case IPC_NET_PLMN_SEL:
233 ipc_net_plmn_sel(info);
235 case IPC_NET_MODE_SEL:
236 ipc_net_mode_sel(info);
239 case IPC_SMS_INCOMING_MSG:
240 ipc_sms_incoming_msg(info);
242 case IPC_SMS_DELIVER_REPORT:
243 ipc_sms_deliver_report(info);
245 case IPC_SMS_SVC_CENTER_ADDR:
246 ipc_sms_svc_center_addr(info);
248 case IPC_SMS_SEND_MSG:
249 ipc_sms_send_msg(info);
251 case IPC_SMS_DEVICE_READY:
252 ipc_sms_device_ready(info);
255 case IPC_CALL_INCOMING:
256 ipc_call_incoming(info);
261 case IPC_CALL_STATUS:
262 ipc_call_status(info);
264 case IPC_CALL_BURST_DTMF:
265 ipc_call_burst_dtmf(info);
268 case IPC_GPRS_IP_CONFIGURATION:
269 ipc_gprs_ip_configuration(info);
271 case IPC_GPRS_CALL_STATUS:
272 ipc_gprs_call_status(info);
274 case IPC_GPRS_PDP_CONTEXT:
275 ipc_gprs_pdp_context(info);
278 LOGD("Unhandled command: %s (%04x)", ipc_command_to_str(IPC_COMMAND(info)), IPC_COMMAND(info));
283 void ipc_rfs_dispatch(struct ipc_message_info *info)
285 switch(IPC_COMMAND(info)) {
286 case IPC_RFS_NV_READ_ITEM:
287 ipc_rfs_nv_read_item(info);
289 case IPC_RFS_NV_WRITE_ITEM:
290 ipc_rfs_nv_write_item(info);
293 LOGD("Unhandled command: %s (%04x)", ipc_command_to_str(IPC_COMMAND(info)), IPC_COMMAND(info));
298 void srs_dispatch(struct srs_message *message)
300 switch(message->command) {
301 case SRS_CONTROL_PING:
302 srs_control_ping(message);
304 case SRS_SND_SET_CALL_CLOCK_SYNC:
305 srs_snd_set_call_clock_sync(message);
307 case SRS_SND_SET_CALL_VOLUME:
308 srs_snd_set_call_volume(message);
310 case SRS_SND_SET_CALL_AUDIO_PATH:
311 srs_snd_set_call_audio_path(message);
314 LOGD("Unhandled command: (%04x)", message->command);
320 * RIL main dispatch function
323 int ril_modem_check(void)
325 if(ipc_fmt_client == NULL)
328 if(ipc_fmt_client->state != RIL_CLIENT_READY)
334 void onRequest(int request, void *data, size_t datalen, RIL_Token t)
336 if(ril_modem_check() < 0)
337 RIL_onRequestComplete(t, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
341 case RIL_REQUEST_RADIO_POWER:
342 ril_request_radio_power(t, data, datalen);
344 case RIL_REQUEST_BASEBAND_VERSION:
345 ril_request_baseband_version(t);
348 case RIL_REQUEST_SIGNAL_STRENGTH:
349 ril_request_signal_strength(t);
352 case RIL_REQUEST_GET_IMEI:
353 ril_request_get_imei(t);
355 case RIL_REQUEST_GET_IMEISV:
356 ril_request_get_imeisv(t);
358 case RIL_REQUEST_GET_IMSI:
359 ril_request_get_imsi(t);
362 case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE:
363 requestSatSendTerminalResponse(t, data, datalen);
365 case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND:
366 requestSatSendEnvelopeCommand(t, data, datalen);
368 case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM:
369 RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
372 case RIL_REQUEST_SEND_USSD:
373 ril_request_send_ussd(t, data, datalen);
375 case RIL_REQUEST_CANCEL_USSD:
376 ril_request_cancel_ussd(t, data, datalen);
378 case RIL_REQUEST_GET_SIM_STATUS:
379 ril_request_get_sim_status(t);
381 case RIL_REQUEST_SIM_IO:
382 ril_request_sim_io(t, data, datalen);
384 case RIL_REQUEST_ENTER_SIM_PIN:
385 ril_request_enter_sim_pin(t, data, datalen);
387 case RIL_REQUEST_CHANGE_SIM_PIN:
388 ril_request_change_sim_pin(t, data, datalen);
390 case RIL_REQUEST_ENTER_SIM_PUK:
391 ril_request_enter_sim_puk(t, data, datalen);
393 case RIL_REQUEST_QUERY_FACILITY_LOCK:
394 ril_request_query_facility_lock(t, data, datalen);
396 case RIL_REQUEST_SET_FACILITY_LOCK:
397 ril_request_set_facility_lock(t, data, datalen);
400 case RIL_REQUEST_OPERATOR:
401 ril_request_operator(t);
403 case RIL_REQUEST_REGISTRATION_STATE:
404 ril_request_registration_state(t);
406 case RIL_REQUEST_GPRS_REGISTRATION_STATE:
407 ril_request_gprs_registration_state(t);
409 case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS:
410 ril_request_query_available_networks(t);
412 case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE:
413 ril_request_get_preferred_network_type(t);
415 case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE:
416 ril_request_set_preferred_network_type(t, data, datalen);
418 case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE:
419 ril_request_query_network_selection_mode(t);
421 case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC:
422 ril_request_set_network_selection_automatic(t);
424 case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL:
425 ril_request_set_network_selection_manual(t, data, datalen);
428 case RIL_REQUEST_SEND_SMS:
429 ril_request_send_sms(t, data, datalen);
431 case RIL_REQUEST_SEND_SMS_EXPECT_MORE:
432 ril_request_send_sms_expect_more(t, data, datalen);
434 case RIL_REQUEST_SMS_ACKNOWLEDGE:
435 ril_request_sms_acknowledge(t, data, datalen);
438 case RIL_REQUEST_DIAL:
439 ril_request_dial(t, data, datalen);
441 case RIL_REQUEST_GET_CURRENT_CALLS:
442 ril_request_get_current_calls(t);
444 case RIL_REQUEST_HANGUP:
445 case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND:
446 case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND:
447 ril_request_hangup(t);
449 case RIL_REQUEST_ANSWER:
450 ril_request_answer(t);
452 case RIL_REQUEST_LAST_CALL_FAIL_CAUSE:
453 ril_request_last_call_fail_cause(t);
455 case RIL_REQUEST_DTMF:
456 ril_request_dtmf(t, data, datalen);
458 case RIL_REQUEST_DTMF_START:
459 ril_request_dtmf_start(t, data, datalen);
461 case RIL_REQUEST_DTMF_STOP:
462 ril_request_dtmf_stop(t);
465 case RIL_REQUEST_SETUP_DATA_CALL:
466 ril_request_setup_data_call(t, data, datalen);
468 case RIL_REQUEST_DEACTIVATE_DATA_CALL:
469 ril_request_deactivate_data_call(t, data, datalen);
471 case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE:
472 ril_request_last_data_call_fail_cause(t);
474 case RIL_REQUEST_DATA_CALL_LIST:
475 ril_request_data_call_list(t);
478 case RIL_REQUEST_SET_MUTE:
479 ril_request_set_mute(t, data, datalen);
481 case RIL_REQUEST_SCREEN_STATE:
482 /* This doesn't affect anything */
483 RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
486 LOGE("Request not implemented: %d\n", request);
487 RIL_onRequestComplete(t, RIL_E_REQUEST_NOT_SUPPORTED, NULL, 0);
493 * RILJ related functions
496 RIL_RadioState currentState()
498 LOGD("currentState()");
499 return ril_state.radio_state;
502 int onSupports(int requestCode)
504 switch(requestCode) {
510 void onCancel(RIL_Token t)
512 ril_request_set_canceled(t, 1);
515 const char *getVersion(void)
517 return RIL_VERSION_STRING;
524 void ril_globals_init(void)
526 memset(&ril_state, 0, sizeof(ril_state));
527 memset(&(ril_state.tokens), 0, sizeof(struct ril_tokens));
529 ril_requests_tokens_init();
530 ipc_gen_phone_res_expects_init();
531 ril_gprs_connections_init();
532 ril_request_sms_init();
533 ipc_sms_tpid_queue_init();
536 void ril_state_lpm(void)
538 ril_state.radio_state = RADIO_STATE_OFF;
539 ril_state.power_mode = POWER_MODE_LPM;
543 static const RIL_RadioFunctions ril_ops = {
552 const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)
559 LOGD("Creating IPC FMT client");
561 ipc_fmt_client = ril_client_new(&ipc_fmt_client_funcs);
562 rc = ril_client_create(ipc_fmt_client);
565 LOGE("IPC FMT client creation failed.");
569 rc = ril_client_thread_start(ipc_fmt_client);
572 LOGE("IPC FMT thread creation failed.");
576 LOGD("IPC FMT client ready");
579 LOGD("Creating IPC RFS client");
581 ipc_rfs_client = ril_client_new(&ipc_rfs_client_funcs);
582 rc = ril_client_create(ipc_rfs_client);
585 LOGE("IPC RFS client creation failed.");
589 rc = ril_client_thread_start(ipc_rfs_client);
592 LOGE("IPC RFS thread creation failed.");
596 LOGD("IPC RFS client ready");
599 LOGD("Creating SRS client");
601 srs_client = ril_client_new(&srs_client_funcs);
602 rc = ril_client_create(srs_client);
605 LOGE("SRS client creation failed.");
609 rc = ril_client_thread_start(srs_client);
612 LOGE("SRS thread creation failed.");
616 LOGD("SRS client ready");
625 int main(int argc, char *argv[])