52
53
static const char *none_prefix[] = { NULL };
53
54
static const char *opmn_prefix[] = { "_OPMN:", NULL };
54
55
static const char *obls_prefix[] = { "_OBLS:", NULL };
56
static const char *opcm_prefix[] = { "_OPCMENABLE:", NULL };
59
62
guint sim_poll_source;
60
63
guint sim_poll_count;
64
ofono_bool_t have_sim;
65
ofono_bool_t have_voice;
64
68
static int hso_probe(struct ofono_modem *modem)
99
103
ofono_info("%s%s", prefix, str);
106
static void opcm_query(gboolean ok, GAtResult *result, gpointer user_data)
108
struct ofono_modem *modem = user_data;
109
struct hso_data *data = ofono_modem_get_data(modem);
117
g_at_result_iter_init(&iter, result);
119
if (!g_at_result_iter_next(&iter, "_OPCMENABLE:"))
122
g_at_chat_send(data->app, "AT_OPCMENABLE=1", none_prefix,
126
static void opcm_support(gboolean ok, GAtResult *result, gpointer user_data)
128
struct ofono_modem *modem = user_data;
129
struct hso_data *data = ofono_modem_get_data(modem);
137
g_at_result_iter_init(&iter, result);
139
if (!g_at_result_iter_next(&iter, "_OPCMENABLE:"))
142
data->have_voice = TRUE;
144
g_at_chat_send(data->app, "AT_OPCMENABLE?", opcm_prefix,
145
opcm_query, modem, NULL);
102
148
static gboolean init_sim_check(gpointer user_data);
104
150
static void sim_status(gboolean ok, GAtResult *result, gpointer user_data)
152
199
init_sim_check, modem);
203
case 1: /* SIM card ready */
156
204
data->have_sim = TRUE;
206
case 2: /* no SIM card */
207
data->have_sim = FALSE;
210
data->have_sim = FALSE;
158
214
data->sim_poll_count = 0;
160
ofono_modem_set_powered(modem, TRUE);
216
ofono_modem_set_powered(modem, data->have_sim);
218
if (data->have_sim == FALSE)
222
* Ensure that the modem is using GSM character set and not IRA,
223
* otherwise weirdness with umlauts and other non-ASCII characters
226
g_at_chat_send(data->control, "AT+CSCS=\"GSM\"", none_prefix,
228
g_at_chat_send(data->app, "AT+CSCS=\"GSM\"", none_prefix,
163
232
* Option has the concept of Speech Service versus
173
242
g_at_chat_send(data->app, "AT_ODO?", none_prefix, NULL, NULL, NULL);
174
243
g_at_chat_send(data->app, "AT_ODO=0", none_prefix, NULL, NULL, NULL);
245
g_at_chat_send(data->app, "AT_OPCMENABLE=?", opcm_prefix,
246
opcm_support, modem, NULL);
177
249
static gboolean init_sim_check(gpointer user_data)
226
298
check_model, modem, NULL);
229
static GAtChat *create_port(const char *device)
301
static GAtChat *open_device(struct ofono_modem *modem,
302
const char *key, char *debug)
231
306
GAtSyntax *syntax;
309
device = ofono_modem_get_string(modem, key);
313
DBG("%s %s", key, device);
235
315
channel = g_at_tty_open(device, NULL);
236
316
if (channel == NULL)
239
319
syntax = g_at_syntax_new_gsm_permissive();
240
320
chat = g_at_chat_new(channel, syntax);
241
321
g_at_syntax_unref(syntax);
242
323
g_io_channel_unref(channel);
244
325
if (chat == NULL)
328
if (getenv("OFONO_AT_DEBUG"))
329
g_at_chat_set_debug(chat, hso_debug, debug);
250
334
static int hso_enable(struct ofono_modem *modem)
252
336
struct hso_data *data = ofono_modem_get_data(modem);
256
338
DBG("%p", modem);
258
control = ofono_modem_get_string(modem, "ControlPort");
259
app = ofono_modem_get_string(modem, "ApplicationPort");
261
if (app == NULL || control == NULL)
340
data->control = open_device(modem, "Control", "Control: ");
341
if (data->control == NULL)
264
data->control = create_port(control);
266
if (data->control == NULL)
269
if (getenv("OFONO_AT_DEBUG"))
270
g_at_chat_set_debug(data->control, hso_debug, "Control: ");
272
data->app = create_port(app);
344
data->app = open_device(modem, "Application", "App: ");
274
345
if (data->app == NULL) {
275
346
g_at_chat_unref(data->control);
276
347
data->control = NULL;
281
if (getenv("OFONO_AT_DEBUG"))
282
g_at_chat_set_debug(data->app, hso_debug, "App: ");
351
data->modem = open_device(modem, "Modem", "Modem: ");
284
g_at_chat_send(data->control, "ATE0", none_prefix, NULL, NULL, NULL);
285
g_at_chat_send(data->app, "ATE0", none_prefix, NULL, NULL, NULL);
353
g_at_chat_send(data->control, "ATE0 +CMEE=1", NULL, NULL, NULL, NULL);
354
g_at_chat_send(data->app, "ATE0 +CMEE=1", NULL, NULL, NULL, NULL);
287
356
g_at_chat_send(data->control, "AT+CFUN=4", none_prefix,
288
357
cfun_enable, modem, NULL);
349
421
if (g_at_chat_send(chat, command, NULL, set_online_cb, cbd, g_free))
424
CALLBACK_WITH_FAILURE(cb, cbd->data);
354
CALLBACK_WITH_FAILURE(cb, cbd->data);
357
429
static void hso_pre_sim(struct ofono_modem *modem)
364
436
ofono_devinfo_create(modem, 0, "atmodem", data->control);
365
437
sim = ofono_sim_create(modem, OFONO_VENDOR_OPTION_HSO,
366
"atmodem", data->control);
438
"atmodem", data->control);
368
440
if (sim && data->have_sim == TRUE)
369
441
ofono_sim_inserted_notify(sim, TRUE);
376
448
DBG("%p", modem);
450
if (data->have_voice == TRUE) {
451
ofono_voicecall_create(modem, OFONO_VENDOR_QUALCOMM_MSM,
452
"atmodem", data->app);
378
455
ofono_phonebook_create(modem, 0, "atmodem", data->app);
379
456
ofono_radio_settings_create(modem, 0, "hsomodem", data->app);
390
467
DBG("%p", modem);
392
469
ofono_netreg_create(modem, OFONO_VENDOR_OPTION_HSO,
393
"atmodem", data->app);
470
"atmodem", data->app);
395
472
ofono_cbs_create(modem, OFONO_VENDOR_QUALCOMM_MSM,
396
"atmodem", data->app);
473
"atmodem", data->app);
397
474
ofono_ussd_create(modem, OFONO_VENDOR_QUALCOMM_MSM,
398
"atmodem", data->app);
475
"atmodem", data->app);
400
477
gprs = ofono_gprs_create(modem, 0, "atmodem", data->app);
401
478
gc = ofono_gprs_context_create(modem, 0, "hsomodem", data->control);