Hi! > > >> Great, good to hear that :) > > > > > > I also got ofonod to work, with rather crazy hacks. But I now have > > > incoming/outgoing calls with GUI :-). > > > > Would you mind sharing those hacks - I would like to play around with > > ofonod as well. Maybe I can help with a way forward. > > Yeah that would be fun to play with :) Ok, I thought I should clean them up first, but hey... sudo emacs /etc/udev/rules.d/55-modem.rules KERNEL=="ttyUSB4", ENV{OFONO_DRIVER}="g1" sudo udevadm trigger And now, the crazy hack follows. Note I'm using AT interface -- which is probably not good idea. Anyway, network/signal strength is detected, and calls seem to work. diff --git a/drivers/atmodem/sms.c b/drivers/atmodem/sms.c index 68b89862..3a9f4bc0 100644 --- a/drivers/atmodem/sms.c +++ b/drivers/atmodem/sms.c @@ -440,6 +440,8 @@ static void at_cmt_notify(GAtResult *result, gpointer user_data) if (data->vendor != OFONO_VENDOR_SIMCOM) at_ack_delivery(sms); + return; + err: ofono_error("Unable to parse CMT notification"); } diff --git a/plugins/g1.c b/plugins/g1.c index d915a565..dd4e735d 100644 --- a/plugins/g1.c +++ b/plugins/g1.c @@ -60,7 +60,8 @@ static void g1_debug(const char *str, void *user_data) /* Detect hardware, and initialize if found */ static int g1_probe(struct ofono_modem *modem) { - DBG(""); + DBG("probing G1"); + DBG("probing G1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); return 0; } @@ -97,14 +98,21 @@ static int g1_enable(struct ofono_modem *modem) DBG(""); + DBG("enabling G1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + device = ofono_modem_get_string(modem, "Device"); - if (device == NULL) - return -EINVAL; + // if (device == NULL) + // return -EINVAL; + device = "/dev/ttyUSB4"; + + DBG(""); channel = g_at_tty_open(device, NULL); if (channel == NULL) return -EIO; + DBG(""); + syntax = g_at_syntax_new_gsm_permissive(); chat = g_at_chat_new(channel, syntax); g_io_channel_unref(channel); @@ -116,11 +124,14 @@ static int g1_enable(struct ofono_modem *modem) if (getenv("OFONO_AT_DEBUG")) g_at_chat_set_debug(chat, g1_debug, ""); + DBG(""); ofono_modem_set_data(modem, chat); + DBG(""); /* ensure modem is in a known state; verbose on, echo/quiet off */ g_at_chat_send(chat, "ATE0Q0V1", NULL, NULL, NULL, NULL); + DBG(""); /* power up modem */ g_at_chat_send(chat, "AT+CFUN=1", NULL, cfun_set_on_cb, modem, NULL); @@ -191,18 +202,56 @@ static void g1_post_sim(struct ofono_modem *modem) ofono_message_waiting_register(mw); } +static void g1_post_online(struct ofono_modem *modem) +{ + DBG(); +} + +static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data) +{ + struct ofono_modem *modem = user_data; + GAtChat *chat = ofono_modem_get_data(modem); + + DBG(""); + + g_at_chat_unref(chat); + ofono_modem_set_data(modem, NULL); + + // if (ok) + // ofono_modem_set_online(modem, TRUE); +} + +static void g1_set_online(struct ofono_modem *modem, ofono_bool_t online, + ofono_modem_online_cb_t cb, void *user_data) +{ + GAtChat *chat = ofono_modem_get_data(modem); + char const *command = online ? "AT+CFUN=1" : "AT+CFUN=4"; + + DBG("modem %p %s", modem, online ? "online" : "offline"); + + if (g_at_chat_send(chat, command, NULL, + set_online_cb, modem, NULL) > 0) + return; + + //CALLBACK_WITH_FAILURE(cb, cbd->data); + +} + static struct ofono_modem_driver g1_driver = { .name = "g1", .probe = g1_probe, .remove = g1_remove, .enable = g1_enable, .disable = g1_disable, + // .set_online = g1_set_online, .pre_sim = g1_pre_sim, .post_sim = g1_post_sim, + .post_online = g1_post_online, }; static int g1_init(void) { + DBG("g1_init!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); return ofono_modem_driver_register(&g1_driver); } diff --git a/plugins/udevng.c b/plugins/udevng.c index ff5d41af..3e0cdf81 100644 --- a/plugins/udevng.c +++ b/plugins/udevng.c @@ -1250,6 +1250,7 @@ static struct { { "cinterion", setup_serial_modem }, { "nokiacdma", setup_serial_modem }, { "sim900", setup_serial_modem }, + { "g1", setup_serial_modem }, { "wavecom", setup_wavecom }, { "tc65", setup_tc65 }, { "ehs6", setup_ehs6 }, @@ -1407,7 +1408,7 @@ static void add_serial_device(struct udev_device *dev) mdev = get_serial_modem_device(dev); if (!mdev) { - DBG("Device is missing required OFONO_DRIVER property"); + //DBG("Device %s %s is missing required OFONO_DRIVER property", udev_device_get_devpath(mdev), udev_device_get_syspath(mdev)); return; } @@ -1419,6 +1420,9 @@ static void add_serial_device(struct udev_device *dev) devnode = udev_device_get_devnode(dev); + DBG("Got OFONO_DRIVER!!!! driver %s path %s\n", driver, devpath); + + if (!syspath || !devpath) return; @@ -1578,8 +1582,6 @@ static struct { { "mbm", "cdc_ether", "0930" }, { "mbm", "cdc_ncm", "0930" }, { "hso", "hso" }, - { "gobi", "qmi_wwan" }, - { "gobi", "qcserial" }, { "sierra", "qmi_wwan", "1199" }, { "sierra", "qcserial", "1199" }, { "sierra", "sierra" }, @@ -1602,6 +1604,8 @@ static struct { { "telit", "cdc_acm", "1bc7", "0021" }, { "telitqmi", "qmi_wwan", "1bc7", "1201" }, { "telitqmi", "option", "1bc7", "1201" }, + { "telitqmi", "qmi_wwan", "22b8", "2a70" }, + { "telitqmi", "option", "22b8", "2a70" }, { "nokia", "option", "0421", "060e" }, { "nokia", "option", "0421", "0623" }, { "samsung", "option", "04e8", "6889" }, @@ -1717,10 +1721,12 @@ static void check_device(struct udev_device *device) return; } +#if 0 if ((g_str_equal(bus, "usb") == TRUE) || (g_str_equal(bus, "usbmisc") == TRUE)) check_usb_device(device); else +#endif add_serial_device(device); } @@ -1746,17 +1752,20 @@ static gboolean create_modem(gpointer key, gpointer value, gpointer user_data) return TRUE; for (i = 0; driver_list[i].name; i++) { + DBG("comparing %s %s", driver_list[i].name, modem->driver); if (g_str_equal(driver_list[i].name, modem->driver) == FALSE) continue; - if (driver_list[i].setup(modem) == TRUE) { + /* if (driver_list[i].setup(modem) == TRUE) */ { ofono_modem_set_string(modem->modem, "SystemPath", syspath); ofono_modem_register(modem->modem); + DBG("create modem is okay?"); return FALSE; } } + DBG("create modem is maybe not okay?"); return TRUE; } @@ -1796,6 +1805,7 @@ static void enumerate_devices(struct udev *context) udev_enumerate_unref(enumerate); g_hash_table_foreach_remove(modem_list, create_modem, NULL); + DBG("Enumerate devices ok?"); } static struct udev *udev_ctx; @@ -1811,6 +1821,8 @@ static gboolean check_modem_list(gpointer user_data) g_hash_table_foreach_remove(modem_list, create_modem, NULL); + DBG("Check modem list ok?"); + return FALSE; } @@ -1820,6 +1832,8 @@ static gboolean udev_event(GIOChannel *channel, GIOCondition cond, struct udev_device *device; const char *action; + DBG("udev event"); + if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) { ofono_warn("Error with udev monitor channel"); udev_watch = 0; @@ -1838,11 +1852,14 @@ static gboolean udev_event(GIOChannel *channel, GIOCondition cond, if (udev_delay > 0) g_source_remove(udev_delay); + DBG("udev event add -> check"); check_device(device); udev_delay = g_timeout_add_seconds(1, check_modem_list, NULL); - } else if (g_str_equal(action, "remove") == TRUE) + } else if (g_str_equal(action, "remove") == TRUE) { + DBG("udev event remove -> remove"); remove_device(device); + } udev_device_unref(device); @@ -1892,8 +1909,10 @@ static int detect_init(void) return -EIO; } + ofono_warn("detect_init..."); modem_list = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, destroy_modem); + ofono_warn("detect_init 2..."); udev_monitor_filter_add_match_subsystem_devtype(udev_mon, "tty", NULL); udev_monitor_filter_add_match_subsystem_devtype(udev_mon, "usb", NULL); diff --git a/src/modem.c b/src/modem.c index 0cee861f..d8dde772 100644 --- a/src/modem.c +++ b/src/modem.c @@ -603,12 +603,14 @@ static gboolean modem_has_sim(struct ofono_modem *modem) static gboolean modem_is_always_online(struct ofono_modem *modem) { + DBG(); if (modem->driver->set_online == NULL) return TRUE; if (ofono_modem_get_boolean(modem, "AlwaysOnline") == TRUE) return TRUE; + DBG("not always"); return FALSE; } @@ -720,8 +722,10 @@ static void sim_state_watch(enum ofono_sim_state new_state, void *user) modem_change_state(modem, MODEM_STATE_OFFLINE); /* Modem is always online, proceed to online state. */ - if (modem_is_always_online(modem) == TRUE) + if (modem_is_always_online(modem) == TRUE) { set_online(modem, TRUE); + modem->online = TRUE; + } if (modem->online == TRUE) modem_change_state(modem, MODEM_STATE_ONLINE); @@ -1882,13 +1886,17 @@ struct ofono_modem *ofono_modem_create(const char *name, const char *type) else snprintf(path, sizeof(path), "/%s", name); - if (!dbus_validate_path(path, NULL)) + if (!dbus_validate_path(path, NULL)) { + DBG("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!bad dbus path"); return NULL; + } modem = g_try_new0(struct ofono_modem, 1); - if (modem == NULL) + if (modem == NULL) { + DBG("!!!out of memory?!"); return modem; + } modem->path = g_strdup(path); modem->driver_type = g_strdup(type); @@ -1900,6 +1908,7 @@ struct ofono_modem *ofono_modem_create(const char *name, const char *type) if (name == NULL) next_modem_id += 1; + DBG("Created new modem, path %s", path); return modem; } diff --git a/src/network.c b/src/network.c index ae3175d4..700183c0 100644 --- a/src/network.c +++ b/src/network.c @@ -980,6 +980,7 @@ static DBusMessage *network_scan(DBusConnection *conn, { struct ofono_netreg *netreg = data; + DBG(); if (netreg->mode == NETWORK_REGISTRATION_MODE_AUTO_ONLY) return __ofono_error_access_denied(msg); @@ -991,6 +992,7 @@ static DBusMessage *network_scan(DBusConnection *conn, netreg->pending = dbus_message_ref(msg); + DBG(); netreg->driver->list_operators(netreg, operator_list_callback, netreg); return NULL; diff --git a/src/voicecall.c b/src/voicecall.c index e4f6a4c0..2c637e58 100644 --- a/src/voicecall.c +++ b/src/voicecall.c @@ -1492,6 +1492,7 @@ static int voicecall_dial(struct ofono_voicecall *vc, const char *number, struct ofono_modem *modem = __ofono_atom_get_modem(vc->atom); struct ofono_phone_number ph; + DBG(""); if (g_slist_length(vc->call_list) >= MAX_VOICE_CALLS) return -EPERM; -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
Attachment:
signature.asc
Description: Digital signature