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

diff --git a/plugins/gemalto.c b/plugins/gemalto.c
index 3739d7b..16ca463 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,24 @@ 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);
        if (channel == NULL)
                return NULL;
 
@@ -118,6 +138,7 @@ static GAtChat *open_device(const char *device)
        chat = g_at_chat_new(channel, syntax);
        g_at_syntax_unref(syntax);
        g_io_channel_unref(channel);
+       g_hash_table_destroy(options);
 
        if (chat == NULL)
                return NULL;
@@ -300,29 +321,33 @@ 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;
 
-       DBG("%p", modem);
+       /* Close devices */
+       g_at_chat_unref(data->mdm);
+       g_at_chat_unref(data->app);
+
+       DBG("");
 
        app = ofono_modem_get_string(modem, "Application");
        mdm = ofono_modem_get_string(modem, "Modem");
 
        if (app == NULL || mdm == NULL)
-               return -EINVAL;
+               return;
 
        /* Open devices */
        data->app = open_device(app);
        if (data->app == NULL)
-               return -EINVAL;
+               return;
 
        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 +365,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);
+
+       DBG("");
+
+       g_at_chat_unregister(data->app, data->modem_ready_id);
+       g_at_chat_cancel(data->app, data->trial_cmd_id);
+
+       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 gboolean gemalto_at_timeout(gpointer user_data)
+{
+       struct ofono_modem *modem = user_data;
+       struct gemalto_data *data = ofono_modem_get_data(modem);
+
+       data->trial_cmd_id = g_at_chat_send(data->app, "AT+CFUN?", none_prefix, 
gemalto_at_cb, modem, NULL);
+
+       return FALSE;
+}
+
+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;
+
+       data->mdm = open_device(mdm);
+       if (data->mdm == NULL) {
+               g_at_chat_unref(data->app);
+               data->app = NULL;
+               return -EINVAL;
+       }
+
+       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;
 }
@@ -449,10 +535,17 @@ static void gemalto_post_sim(struct ofono_modem *modem)
 static void gemalto_post_online(struct ofono_modem *modem)
 {
        struct gemalto_data *data = ofono_modem_get_data(modem);
+       const char *model;
 
        DBG("%p", modem);
 
        ofono_netreg_create(modem, OFONO_VENDOR_CINTERION, "atmodem", 
data->app);
+
+       model = ofono_modem_get_string(modem, "Model");
+
+       if(!strncmp(model, GEMALTO_MODEL_ALS3, 4)) {
+               ofono_lte_create(modem, "atmodem", data->app);
+       }
 }
 
 static struct ofono_modem_driver gemalto_driver = {
-- 
1.9.1

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

Reply via email to