Huawei EM770W is a 3G WCDMA modem that supports HSPA/UMTS/EDGE/GPRS/GSM
data service and WCDMA/GSM short message services. It also has voice
call capability that supports both 2G and 3G network.
---
 plugins/huawei.c    |   31 ++++++++++++++++++++++++++++++-
 plugins/ofono.rules |    3 +++
 plugins/udev.c      |    3 +++
 3 files changed, 36 insertions(+), 1 deletions(-)

diff --git a/plugins/huawei.c b/plugins/huawei.c
index e2dfd1e..0dc6ae4 100644
--- a/plugins/huawei.c
+++ b/plugins/huawei.c
@@ -43,13 +43,24 @@
 #include <ofono/gprs.h>
 #include <ofono/gprs.h>
 #include <ofono/gprs-context.h>
+#include <ofono/voicecall.h>
+#include <ofono/call-forwarding.h>
+#include <ofono/call-settings.h>
+#include <ofono/call-meter.h>
+#include <ofono/call-barring.h>
+#include <ofono/ssn.h>
+#include <ofono/phonebook.h>
+#include <ofono/message-waiting.h>
 #include <ofono/log.h>
 
 #include <drivers/atmodem/atutil.h>
 #include <drivers/atmodem/vendor.h>
 
+#define HUAWEI_MODEL_EM770W "1404"
+
 static const char *none_prefix[] = { NULL };
 static const char *sysinfo_prefix[] = { "^SYSINFO:", NULL };
+static const char *model = "";
 
 struct huawei_data {
        GAtChat *modem;
@@ -205,8 +216,9 @@ static int huawei_enable(struct ofono_modem *modem)
 
        modem_device = ofono_modem_get_string(modem, "Modem");
        pcui_device = ofono_modem_get_string(modem, "Pcui");
+       model = ofono_modem_get_string(modem, "Model");
 
-       if (modem_device == NULL || pcui_device == NULL)
+       if (modem_device == NULL || pcui_device == NULL || model == NULL)
                return -EINVAL;
 
        data->modem = create_port(modem_device);
@@ -288,6 +300,9 @@ static void huawei_pre_sim(struct ofono_modem *modem)
 
        ofono_devinfo_create(modem, 0, "atmodem", data->pcui);
        data->sim = ofono_sim_create(modem, 0, "atmodem", data->pcui);
+
+       if (g_str_equal(model, HUAWEI_MODEL_EM770W))
+               ofono_voicecall_create(modem, 0, "atmodem", data->pcui);
 }
 
 static void huawei_post_sim(struct ofono_modem *modem)
@@ -296,6 +311,7 @@ static void huawei_post_sim(struct ofono_modem *modem)
        struct ofono_gprs_context *gc;
        struct ofono_netreg *netreg;
        struct ofono_gprs *gprs;
+       struct ofono_message_waiting *mw;
 
        DBG("%p", modem);
 
@@ -312,6 +328,19 @@ static void huawei_post_sim(struct ofono_modem *modem)
 
        if (gprs && gc)
                ofono_gprs_add_context(gprs, gc);
+
+       if (g_str_equal(model, HUAWEI_MODEL_EM770W)) {
+               ofono_call_forwarding_create(modem, 0, "atmodem", data->pcui);
+               ofono_call_settings_create(modem, 0, "atmodem", data->pcui);
+               ofono_call_meter_create(modem, 0, "atmodem", data->pcui);
+               ofono_call_barring_create(modem, 0, "atmodem", data->pcui);
+               ofono_ssn_create(modem, 0, "atmodem", data->pcui);
+               ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
+
+               mw = ofono_message_waiting_create(modem);
+               if (mw)
+                       ofono_message_waiting_register(mw);
+       }
 }
 
 static struct ofono_modem_driver huawei_driver = {
diff --git a/plugins/ofono.rules b/plugins/ofono.rules
index 06c5c8f..3541833 100644
--- a/plugins/ofono.rules
+++ b/plugins/ofono.rules
@@ -24,6 +24,9 @@ ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1401", 
ENV{OFONO_IFACE_NUM}=="02", E
 ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1402", ENV{OFONO_IFACE_NUM}=="00", 
ENV{OFONO_HUAWEI_TYPE}="Modem"
 ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1402", ENV{OFONO_IFACE_NUM}=="02", 
ENV{OFONO_HUAWEI_TYPE}="Pcui"
 
+ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1404", ENV{OFONO_IFACE_NUM}=="00", 
ENV{OFONO_HUAWEI_TYPE}="Modem"
+ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1404", ENV{OFONO_IFACE_NUM}=="02", 
ENV{OFONO_HUAWEI_TYPE}="Pcui"
+
 ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1405", ENV{OFONO_IFACE_NUM}=="03", 
ENV{OFONO_HUAWEI_TYPE}="Modem"
 ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1405", ENV{OFONO_IFACE_NUM}=="00", 
ENV{OFONO_HUAWEI_TYPE}="Pcui"
 
diff --git a/plugins/udev.c b/plugins/udev.c
index 09ee93e..7d34b0b 100644
--- a/plugins/udev.c
+++ b/plugins/udev.c
@@ -227,6 +227,9 @@ static void add_huawei(struct ofono_modem *modem,
                const char *name = udev_list_entry_get_name(entry);
                type = udev_list_entry_get_value(entry);
 
+               if (g_str_equal(name, "ID_MODEL_ID") == TRUE)
+                       ofono_modem_set_string(modem, "Model", type);
+
                if (g_str_equal(name, "OFONO_HUAWEI_TYPE") != TRUE) {
                        entry = udev_list_entry_get_next(entry);
                        continue;
-- 
1.6.3.3

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to