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"
40 * - ipc_disp_icon_info: trace on RILJ & emulate RIl_REQUEST_SIGNAL_STRENGTH
41 * - airplane mode: trace: sys nodes?
42 * - look at /sys nodes for data and airplane
43 * - fails at killall zygote? → airplane mode bug?
44 * - gen phone res queue → apply to max functions
45 * - DTMF burst queue + lock, DTMF_START lock
48 * - find a reliable way to configure data iface
49 * - GPRS: IPC_GPRS_CALL_STATUS, LAST_DATA_CALL_FAIL_CAUSE
50 * - check data with orange non-free ril: no gprs_ip_config
51 * - data: use IPC_GPRS_CALL_STATUS with global token for possible fail or return anyway and store ip config global?
52 * - update global fail cause in global after gprs_call_status, generic error on stored token
59 struct ril_client *ipc_fmt_client;
60 struct ril_client *ipc_rfs_client;
61 struct ril_client *srs_client;
63 const struct RIL_Env *ril_env;
64 struct ril_state ril_state;
70 struct ril_request_token ril_requests_tokens[0x100];
71 int ril_request_id = 0;
73 void ril_requests_tokens_init(void)
75 memset(ril_requests_tokens, 0, sizeof(struct ril_request_token) * 0x100);
78 int ril_request_id_new(void)
81 ril_request_id %= 0x100;
82 return ril_request_id;
85 int ril_request_reg_id(RIL_Token token)
87 int id = ril_request_id_new();
89 ril_requests_tokens[id].token = token;
90 ril_requests_tokens[id].canceled = 0;
95 int ril_request_get_id(RIL_Token token)
99 for(i=0 ; i < 0x100 ; i++)
100 if(ril_requests_tokens[i].token == token)
103 // If the token isn't registered yet, register it
104 return ril_request_reg_id(token);
107 RIL_Token ril_request_get_token(int id)
109 return ril_requests_tokens[id].token;
112 int ril_request_get_canceled(RIL_Token token)
116 id = ril_request_get_id(token);
118 if(ril_requests_tokens[id].canceled > 0)
124 void ril_request_set_canceled(RIL_Token token, int canceled)
128 id = ril_request_get_id(token);
130 ril_requests_tokens[id].canceled = canceled;
133 void RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen)
135 if(!ril_request_get_canceled(t))
136 RIL_onRequestCompleteReal(t, e, response, responselen);
138 RIL_onRequestCompleteReal(t, RIL_E_CANCELLED, response, responselen);
145 void ril_tokens_check(void)
147 if(ril_state.tokens.baseband_version != 0) {
148 if(ril_state.radio_state != RADIO_STATE_OFF) {
149 ril_request_baseband_version(ril_state.tokens.baseband_version);
150 ril_state.tokens.baseband_version = 0;
154 if(ril_state.tokens.get_imei != 0) {
155 if(ril_state.radio_state != RADIO_STATE_OFF) {
156 ril_request_get_imei(ril_state.tokens.get_imei);
157 ril_state.tokens.get_imei = 0;
163 * Clients dispatch functions
166 void ipc_fmt_dispatch(struct ipc_message_info *info)
168 switch(IPC_COMMAND(info)) {
170 case IPC_GEN_PHONE_RES:
171 ipc_gen_phone_res(info);
174 case IPC_PWR_PHONE_PWR_UP:
175 ipc_pwr_phone_pwr_up();
177 case IPC_PWR_PHONE_STATE:
178 ipc_pwr_phone_state(info);
181 case IPC_DISP_ICON_INFO:
182 ipc_disp_icon_info(info);
184 case IPC_DISP_RSSI_INFO:
185 ipc_disp_rssi_info(info);
189 ipc_misc_me_sn(info);
191 case IPC_MISC_ME_VERSION:
192 ipc_misc_me_version(info);
194 case IPC_MISC_ME_IMSI:
195 ipc_misc_me_imsi(info);
197 case IPC_MISC_TIME_INFO:
198 ipc_misc_time_info(info);
201 case IPC_SAT_PROACTIVE_CMD:
202 respondSatProactiveCmd(info);
204 case IPC_SAT_ENVELOPE_CMD:
205 respondSatEnvelopeCmd(info);
212 case IPC_SEC_PIN_STATUS:
213 ipc_sec_pin_status(info);
215 case IPC_SEC_LOCK_INFO:
216 ipc_sec_lock_info(info);
218 case IPC_SEC_RSIM_ACCESS:
219 ipc_sec_rsim_access(info);
221 case IPC_SEC_PHONE_LOCK:
222 ipc_sec_phone_lock(info);
225 case IPC_NET_CURRENT_PLMN:
226 ipc_net_current_plmn(info);
229 ipc_net_regist(info);
231 case IPC_NET_PLMN_LIST:
232 ipc_net_plmn_list(info);
234 case IPC_NET_PLMN_SEL:
235 ipc_net_plmn_sel(info);
237 case IPC_NET_MODE_SEL:
238 ipc_net_mode_sel(info);
241 case IPC_SMS_INCOMING_MSG:
242 ipc_sms_incoming_msg(info);
244 case IPC_SMS_DELIVER_REPORT:
245 ipc_sms_deliver_report(info);
247 case IPC_SMS_SVC_CENTER_ADDR:
248 ipc_sms_svc_center_addr(info);
250 case IPC_SMS_SEND_MSG:
251 ipc_sms_send_msg(info);
253 case IPC_SMS_DEVICE_READY:
254 ipc_sms_device_ready(info);
257 case IPC_CALL_INCOMING:
258 ipc_call_incoming(info);
263 case IPC_CALL_STATUS:
264 ipc_call_status(info);
266 case IPC_CALL_BURST_DTMF:
267 ipc_call_burst_dtmf(info);
270 case IPC_GPRS_IP_CONFIGURATION:
271 ipc_gprs_ip_configuration(info);
274 LOGD("Unhandled command: %s (%04x)", ipc_command_to_str(IPC_COMMAND(info)), IPC_COMMAND(info));
279 void ipc_rfs_dispatch(struct ipc_message_info *info)
281 switch(IPC_COMMAND(info)) {
282 case IPC_RFS_NV_READ_ITEM:
283 ipc_rfs_nv_read_item(info);
285 case IPC_RFS_NV_WRITE_ITEM:
286 ipc_rfs_nv_write_item(info);
289 LOGD("Unhandled command: %s (%04x)", ipc_command_to_str(IPC_COMMAND(info)), IPC_COMMAND(info));
294 void srs_dispatch(struct srs_message *message)
296 switch(message->command) {
297 case SRS_CONTROL_PING:
298 srs_control_ping(message);
300 case SRS_SND_SET_CALL_CLOCK_SYNC:
301 srs_snd_set_call_clock_sync(message);
303 case SRS_SND_SET_CALL_VOLUME:
304 srs_snd_set_call_volume(message);
306 case SRS_SND_SET_CALL_AUDIO_PATH:
307 srs_snd_set_call_audio_path(message);
310 LOGD("Unhandled command: (%04x)", message->command);
316 * RIL main dispatch function
319 int ril_modem_check(void)
321 if(ipc_fmt_client == NULL)
324 if(ipc_fmt_client->state != RIL_CLIENT_READY)
330 void onRequest(int request, void *data, size_t datalen, RIL_Token t)
332 if(ril_modem_check() < 0)
333 RIL_onRequestComplete(t, RIL_E_RADIO_NOT_AVAILABLE, NULL, 0);
337 case RIL_REQUEST_RADIO_POWER:
338 ril_request_radio_power(t, data, datalen);
340 case RIL_REQUEST_BASEBAND_VERSION:
341 ril_request_baseband_version(t);
344 case RIL_REQUEST_GET_IMEI:
345 ril_request_get_imei(t);
347 case RIL_REQUEST_GET_IMEISV:
348 ril_request_get_imeisv(t);
350 case RIL_REQUEST_GET_IMSI:
351 ril_request_get_imsi(t);
354 case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE:
355 requestSatSendTerminalResponse(t, data, datalen);
357 case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND:
358 requestSatSendEnvelopeCommand(t, data, datalen);
360 case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM:
361 RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
364 case RIL_REQUEST_SEND_USSD:
365 ril_request_send_ussd(t, data, datalen);
367 case RIL_REQUEST_CANCEL_USSD:
368 ril_request_cancel_ussd(t, data, datalen);
370 case RIL_REQUEST_GET_SIM_STATUS:
371 ril_request_sim_status(t);
373 case RIL_REQUEST_SIM_IO:
374 ril_request_sim_io(t, data, datalen);
376 case RIL_REQUEST_ENTER_SIM_PIN:
377 ril_request_enter_sim_pin(t, data, datalen);
379 case RIL_REQUEST_QUERY_FACILITY_LOCK:
380 ril_request_query_facility_lock(t, data, datalen);
382 case RIL_REQUEST_SET_FACILITY_LOCK:
383 ril_request_set_facility_lock(t, data, datalen);
386 case RIL_REQUEST_OPERATOR:
387 ril_request_operator(t);
389 case RIL_REQUEST_REGISTRATION_STATE:
390 ril_request_registration_state(t);
392 case RIL_REQUEST_GPRS_REGISTRATION_STATE:
393 ril_request_gprs_registration_state(t);
395 case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS:
396 ril_request_query_available_networks(t);
398 case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE:
399 ril_request_get_preferred_network_type(t);
401 case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE:
402 ril_request_set_preferred_network_type(t, data, datalen);
404 case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE:
405 ril_request_query_network_selection_mode(t);
407 case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC:
408 ril_request_set_network_selection_automatic(t);
410 case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL:
411 ril_request_set_network_selection_manual(t, data, datalen);
414 case RIL_REQUEST_SEND_SMS:
415 ril_request_send_sms(t, data, datalen);
417 case RIL_REQUEST_SEND_SMS_EXPECT_MORE:
418 ril_request_send_sms_expect_more(t, data, datalen);
420 case RIL_REQUEST_SMS_ACKNOWLEDGE:
421 ril_request_sms_acknowledge(t, data, datalen);
424 case RIL_REQUEST_DIAL:
425 ril_request_dial(t, data, datalen);
427 case RIL_REQUEST_GET_CURRENT_CALLS:
428 ril_request_get_current_calls(t);
430 case RIL_REQUEST_HANGUP:
431 case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND:
432 case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND:
433 ril_request_hangup(t);
435 case RIL_REQUEST_ANSWER:
436 ril_request_answer(t);
438 case RIL_REQUEST_DTMF:
439 ril_request_dtmf(t, data, datalen);
441 case RIL_REQUEST_DTMF_START:
442 ril_request_dtmf_start(t, data, datalen);
444 case RIL_REQUEST_DTMF_STOP:
445 ril_request_dtmf_stop(t);
448 case RIL_REQUEST_SETUP_DATA_CALL:
449 ril_request_setup_data_call(t, data, datalen);
451 case RIL_REQUEST_DEACTIVATE_DATA_CALL:
452 ril_request_deactivate_data_call(t, data, datalen);
455 case RIL_REQUEST_SET_MUTE:
456 ril_request_set_mute(t, data, datalen);
458 case RIL_REQUEST_SCREEN_STATE:
459 /* This doesn't affect anything */
460 RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
463 LOGE("Request not implemented: %d\n", request);
464 RIL_onRequestComplete(t, RIL_E_REQUEST_NOT_SUPPORTED, NULL, 0);
470 * RILJ related functions
473 RIL_RadioState currentState()
475 return ril_state.radio_state;
478 int onSupports(int requestCode)
480 switch(requestCode) {
486 void onCancel(RIL_Token t)
488 ril_request_set_canceled(t, 1);
491 const char *getVersion(void)
493 return RIL_VERSION_STRING;
500 void ril_globals_init(void)
502 memset(&ril_state, 0, sizeof(ril_state));
503 memset(&(ril_state.tokens), 0, sizeof(struct ril_tokens));
505 ril_requests_tokens_init();
506 ipc_gen_phone_res_expects_init();
507 ril_request_sms_init();
508 ipc_sms_tpid_queue_init();
511 void ril_state_lpm(void)
513 ril_state.radio_state = RADIO_STATE_OFF;
514 ril_state.power_mode = POWER_MODE_LPM;
518 static const RIL_RadioFunctions ril_ops = {
527 const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)
537 LOGD("Creating IPC FMT client");
539 ipc_fmt_client = ril_client_new(&ipc_fmt_client_funcs);
540 rc = ril_client_create(ipc_fmt_client);
543 LOGE("IPC FMT client creation failed.");
547 rc = ril_client_thread_start(ipc_fmt_client);
550 LOGE("IPC FMT thread creation failed.");
554 LOGD("IPC FMT client ready");
557 LOGD("Creating IPC RFS client");
559 ipc_rfs_client = ril_client_new(&ipc_rfs_client_funcs);
560 rc = ril_client_create(ipc_rfs_client);
563 LOGE("IPC RFS client creation failed.");
567 rc = ril_client_thread_start(ipc_rfs_client);
570 LOGE("IPC RFS thread creation failed.");
574 LOGD("IPC RFS client ready");
577 LOGD("Creating SRS client");
579 srs_client = ril_client_new(&srs_client_funcs);
580 rc = ril_client_create(srs_client);
583 LOGE("SRS client creation failed.");
587 rc = ril_client_thread_start(srs_client);
590 LOGE("SRS thread creation failed.");
594 LOGD("SRS client ready");
600 int main(int argc, char *argv[])