Force serial port opening options
Wait for modem to be ready to start
initializing it
Handle LTE
---
 plugins/gemalto.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 94 insertions(+), 12 deletions(-)

diff --git a/plugins/gemalto.c b/plugins/gemalto.c
index 3739d7b..af50a9b 100644
--- a/plugins/gemalto.c
+++ b/plugins/gemalto.c
@@ -53,6 +53,10 @@
 
 #define HARDWARE_MONITOR_INTERFACE OFONO_SERVICE ".cinterion.HardwareMonitor"
 
+/* Supported gemalto's modem */
+#define GEMALTO_MODEL_PHS8P    "0053"
+#define GEMALTO_MODEL_ALS3             "0061"
+
 static const char *none_prefix[] = { NULL };
 static const char *sctm_prefix[] = { "^SCTM:", NULL };
 static const char *sbv_prefix[] = { "^SBV:", NULL };
@@ -70,6 +74,8 @@ struct gemalto_data {
        gboolean have_sim;
        struct at_util_sim_state_query *sim_state_query;
        struct gemalto_hardware_monitor *hm;
+       guint modem_ready_id;
+       guint trial_cmd_id;
 };
 
 static int gemalto_probe(struct ofono_modem *modem)
@@ -107,10 +113,26 @@ static GAtChat *open_device(const char *device)
        GAtSyntax *syntax;
        GIOChannel *channel;
        GAtChat *chat;
+       GHashTable *options;
+
+       options = g_hash_table_new(g_str_hash, g_str_equal);
+       if (options == NULL)
+               return NULL;
+
+       g_hash_table_insert(options, "Baud", "115200");
+       g_hash_table_insert(options, "StopBits", "1");
+       g_hash_table_insert(options, "DataBits", "8");
+       g_hash_table_insert(options, "Parity", "none");
+       g_hash_table_insert(options, "XonXoff", "off");
+       g_hash_table_insert(options, "RtsCts", "on");
+       g_hash_table_insert(options, "Local", "on");
+       g_hash_table_insert(options, "Read", "on");
 
        DBG("Opening device %s", device);
 
-       channel = g_at_tty_open(device, NULL);
+       channel = g_at_tty_open(device, options);
+       g_hash_table_destroy(options);
+
        if (channel == NULL)
                return NULL;
 
@@ -300,29 +322,24 @@ static int gemalto_hardware_monitor_enable(struct 
ofono_modem *modem)
        return 0;
 }
 
-static int gemalto_enable(struct ofono_modem *modem)
+static void gemalto_initialize(struct ofono_modem *modem)
 {
        struct gemalto_data *data = ofono_modem_get_data(modem);
-       const char *app, *mdm;
+       const char *mdm;
 
-       DBG("%p", modem);
+       DBG("");
 
-       app = ofono_modem_get_string(modem, "Application");
        mdm = ofono_modem_get_string(modem, "Modem");
 
-       if (app == NULL || mdm == NULL)
-               return -EINVAL;
+       if (mdm == NULL)
+               return;
 
        /* Open devices */
-       data->app = open_device(app);
-       if (data->app == NULL)
-               return -EINVAL;
-
        data->mdm = open_device(mdm);
        if (data->mdm == NULL) {
                g_at_chat_unref(data->app);
                data->app = NULL;
-               return -EINVAL;
+               return;
        }
 
        if (getenv("OFONO_AT_DEBUG")) {
@@ -340,6 +357,67 @@ static int gemalto_enable(struct ofono_modem *modem)
                        cfun_enable, modem, NULL);
 
        gemalto_hardware_monitor_enable(modem);
+}
+
+static void gemalto_modem_ready(GAtResult *result, gpointer user_data)
+{
+       struct ofono_modem *modem = user_data;
+       struct gemalto_data *data = ofono_modem_get_data(modem);
+       const char *app = ofono_modem_get_string(modem, "Application");
+
+       DBG("");
+
+       g_at_chat_unregister(data->app, data->modem_ready_id);
+       g_at_chat_cancel(data->app, data->trial_cmd_id);
+
+       /*!
+        * As the modem wasn't ready to handle AT commands when we opened
+        * it, we have to close and reopen the device app.
+        */
+       g_at_chat_unref(data->app);
+
+       if(app == NULL)
+               return;
+
+       data->app = open_device(app);
+       if (data->app == NULL)
+               return;
+
+       gemalto_initialize(modem);
+}
+
+static void gemalto_at_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+       struct ofono_modem *modem = user_data;
+       struct gemalto_data *data = ofono_modem_get_data(modem);
+
+       g_at_chat_unregister(data->app, data->modem_ready_id);
+       gemalto_initialize(modem);
+}
+
+static int gemalto_enable(struct ofono_modem *modem)
+{
+       struct gemalto_data *data = ofono_modem_get_data(modem);
+       const char *app, *mdm;
+
+       DBG("%p", modem);
+
+       app = ofono_modem_get_string(modem, "Application");
+       mdm = ofono_modem_get_string(modem, "Modem");
+
+       if (app == NULL || mdm == NULL)
+               return -EINVAL;
+
+       /* Open devices */
+       data->app = open_device(app);
+       if (data->app == NULL)
+               return -EINVAL;
+
+       /* Try the AT command. If it doesn't work, wait for ^SYSSTART */
+       data->modem_ready_id = g_at_chat_register(data->app, "^SYSSTART",
+                                                               
gemalto_modem_ready, FALSE, modem, NULL);
+       data->trial_cmd_id = g_at_chat_send(data->app, "ATE0 AT",
+                                                               none_prefix, 
gemalto_at_cb, modem, NULL);
 
        return -EINPROGRESS;
 }
@@ -432,6 +510,7 @@ static void gemalto_post_sim(struct ofono_modem *modem)
        struct gemalto_data *data = ofono_modem_get_data(modem);
        struct ofono_gprs *gprs;
        struct ofono_gprs_context *gc;
+       const char *model = ofono_modem_get_string(modem, "Model");
 
        DBG("%p", modem);
 
@@ -444,6 +523,9 @@ static void gemalto_post_sim(struct ofono_modem *modem)
 
        if (gprs && gc)
                ofono_gprs_add_context(gprs, gc);
+
+       if (!g_strcmp0(model, GEMALTO_MODEL_ALS3))
+               ofono_lte_create(modem, OFONO_VENDOR_CINTERION, "atmodem", 
data->app);
 }
 
 static void gemalto_post_online(struct ofono_modem *modem)
-- 
1.9.1

_______________________________________________
ofono mailing list
ofono@ofono.org
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to