4 * Copyright (c) 2013 Samsung Electronics Co. Ltd. All rights reserved.
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.
28 #include <core_object.h>
32 #include "imc_modem.h"
36 #include "imc_network.h"
41 #include "imc_phonebook.h"
44 #include "imc_common.h"
46 /* Initializer Table */
47 TcoreObjectInitializer imc_init_table = {
48 .modem_init = imc_modem_init,
49 .sim_init = imc_sim_init,
50 .sat_init = imc_sat_init,
51 .sap_init = imc_sap_init,
52 .network_init = imc_network_init,
53 .ps_init = imc_ps_init,
54 .call_init = imc_call_init,
55 .ss_init = imc_ss_init,
56 .sms_init = imc_sms_init,
57 .phonebook_init = imc_phonebook_init,
58 .gps_init = imc_gps_init,
61 /* Deinitializer Table */
62 TcoreObjectDeinitializer imc_deinit_table = {
63 .modem_deinit = imc_modem_exit,
64 .sim_deinit = imc_sim_exit,
65 .sat_deinit = imc_sat_exit,
66 .sap_deinit = imc_sap_exit,
67 .network_deinit = imc_network_exit,
68 .ps_deinit = imc_ps_exit,
69 .call_deinit = imc_call_exit,
70 .ss_deinit = imc_ss_exit,
71 .sms_deinit = imc_sms_exit,
72 .phonebook_deinit = imc_phonebook_exit,
73 .gps_deinit = imc_gps_exit,
76 static void __send_request(CoreObject *co, const gchar *at_cmd,
77 TcorePendingResponseCallback resp_cb, void *resp_cb_data)
79 (void)tcore_at_prepare_and_send_request(co, at_cmd, NULL,
80 TCORE_AT_COMMAND_TYPE_NO_RESULT,
81 TCORE_PENDING_PRIORITY_DEFAULT,
83 resp_cb, resp_cb_data,
84 on_send_imc_request, NULL,
88 static void __on_response_subscribe_bootup_notification(TcorePending *p,
89 guint data_len, const void *data, void *user_data)
91 const TcoreAtResponse *at_resp = data;
94 if (at_resp && at_resp->success) {
95 dbg("Subscription for '%s' - [OK]", (gchar *)user_data);
97 err("Subscription for '%s' - [NOK]", (gchar *)user_data);
101 tcore_free(user_data);
104 static void __on_response_subscribe_bootup_notification_last(TcorePending *p,
105 guint data_len, const void *data, void *user_data)
107 const TcoreAtResponse *at_resp = data;
108 TcorePlugin *plugin = tcore_pending_ref_plugin(p);
111 if (at_resp && at_resp->success) {
112 dbg("[Last] Subscription for '%s' - [OK]", (gchar *)user_data);
114 err("[Last] Subscription for '%s' - [NOK]", (gchar *)user_data);
118 tcore_free(user_data);
120 dbg("Boot-up configration completed for IMC modem, "
121 "Bring CP to ONLINE state based on Flight mode status");
124 ret = imc_modem_power_on_modem(plugin);
125 dbg("Modem Power ON: [%s]", (ret == TRUE ? "SUCCESS" : "FAIL"));
127 /* NVM Registration */
128 dbg("Registering modem for NVM manager");
129 imc_modem_register_nvm(tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_MODEM));
132 static void __subscribe_modem_notifications(TcorePlugin *plugin)
134 CoreObject *call, *sim, *sms, *network, *ps, *gps;
140 /****** SIM subscriptions ******/
141 sim = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_SIM);
143 __send_request(sim, "AT+XSIMSTATE=1",
144 __on_response_subscribe_bootup_notification,
145 tcore_strdup("AT+XSIMSTATE=1"));
147 /****** CALL subscriptions ******/
148 call = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_CALL);
150 __send_request(call, "AT+XCALLSTAT=1",
151 __on_response_subscribe_bootup_notification,
152 tcore_strdup("AT+XCALLSTAT=1"));
155 __send_request(call, "AT+CSSN=1,1",
156 __on_response_subscribe_bootup_notification,
157 tcore_strdup("AT+CSSN=1,1"));
160 __send_request(call, "AT+CUSD=1",
161 __on_response_subscribe_bootup_notification,
162 tcore_strdup("AT+CUSD=1"));
165 __send_request(call, "AT+CLIP=1",
166 __on_response_subscribe_bootup_notification,
167 tcore_strdup("AT+CLIP=1"));
169 /****** NETWORK subscriptions ******/
170 network = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_NETWORK);
172 __send_request(network, "AT+CREG=2",
173 __on_response_subscribe_bootup_notification,
174 tcore_strdup("AT+CREG=2"));
177 __send_request(network, "AT+CGREG=2",
178 __on_response_subscribe_bootup_notification,
179 tcore_strdup("AT+CGREG=2"));
181 /* Allow Automatic Time Zone updation via NITZ */
182 __send_request(network, "AT+CTZU=1",
183 __on_response_subscribe_bootup_notification,
184 tcore_strdup("AT+CTZU=1"));
186 /* TZ, Time & Daylight changing event reporting Subscription */
187 __send_request(network, "AT+CTZR=1",
188 __on_response_subscribe_bootup_notification,
189 tcore_strdup("AT+CTZR=1"));
192 __send_request(network, "AT+XMER=1",
193 __on_response_subscribe_bootup_notification,
194 tcore_strdup("AT+XMER=1"));
196 /****** PS subscriptions ******/
197 ps = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_PS);
199 __send_request(ps, "AT+CGEREP=1",
200 __on_response_subscribe_bootup_notification,
201 tcore_strdup("AT+CGEREP=1"));
204 __send_request(ps, "AT+XDATASTAT=1",
205 __on_response_subscribe_bootup_notification,
206 tcore_strdup("AT+XDATASTAT=1"));
209 __send_request(ps, "AT+XDNS=1,1",
210 __on_response_subscribe_bootup_notification,
211 tcore_strdup("AT+XDNS=1,1"));
214 __send_request(ps, "AT+CMEE=2",
215 __on_response_subscribe_bootup_notification,
216 tcore_strdup("AT+CMEE=2"));
218 /****** SMS subscriptions ******/
219 sms = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_SMS);
221 __send_request(sms, "AT+CMEE=2",
222 __on_response_subscribe_bootup_notification,
223 tcore_strdup("AT+CMEE=2"));
225 /* Incoming SMS, Cell Broadcast, Status Report Subscription */
226 __send_request(sms, "AT+CNMI=1,2,2,1,0",
227 __on_response_subscribe_bootup_notification,
228 tcore_strdup("AT+CNMI=1,2,2,1,0"));
230 /* Text/PDU mode Subscription */
231 __send_request(sms, "AT+CMGF=0",
232 __on_response_subscribe_bootup_notification,
233 tcore_strdup("AT+CMGF=0"));
235 #if 0 /* Temporarily Blocking as modem doesn't support */
236 /****** SAP subscriptions ******/
237 sap = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_SAP);
239 __send_request(sap, "AT+XBCSTAT=1",
240 __on_response_subscribe_bootup_notification,
241 tcore_strdup("AT+XBCSTAT=1"));
242 #endif /* Temporarily Blocking as modem doesn't support */
244 /****** GPS subscriptions ******/
245 gps = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_GPS);
246 /* AGPS- Assist Data and Reset Assist Data Subscription */
247 __send_request(gps, "AT+CPOSR=1",
248 __on_response_subscribe_bootup_notification,
249 tcore_strdup("AT+CPOSR=1"));
251 __send_request(gps, "AT+XCPOSR=1",
252 __on_response_subscribe_bootup_notification_last,
253 tcore_strdup("AT+XCPOSR=1"));
258 static gboolean on_load()
265 static gboolean on_init(TcorePlugin *p)
268 tcore_check_return_value(p != NULL, FALSE);
270 /* Initialize Modules (Core Objects) */
271 if (tcore_object_init_objects(p, &imc_init_table)
272 != TEL_RETURN_SUCCESS) {
273 err("Failed to initialize Core Objects");
277 /* Subscribe for the Events from CP */
278 __subscribe_modem_notifications(p);
280 dbg("Init - Successful");
284 static void on_unload(TcorePlugin *p)
287 tcore_check_return(p != NULL);
289 /* Deinitialize Modules (Core Objects) */
290 tcore_object_deinit_objects(p, &imc_deinit_table);
293 /* IMC - Modem Plug-in Descriptor */
294 struct tcore_plugin_define_desc plugin_define_desc = {
296 .priority = TCORE_PLUGIN_PRIORITY_MID,