mirror of git://git.sysmocom.de/ofono
huawei: Rework huawei plugin
- Use the PCUI (event) port for all commands unrelated to ppp - Use the Modem port for ppp
This commit is contained in:
parent
588b689d2b
commit
cc6a43c477
132
plugins/huawei.c
132
plugins/huawei.c
|
@ -52,8 +52,8 @@ static const char *none_prefix[] = { NULL };
|
|||
static const char *sysinfo_prefix[] = { "^SYSINFO:", NULL };
|
||||
|
||||
struct huawei_data {
|
||||
GAtChat *chat;
|
||||
GAtChat *event;
|
||||
GAtChat *modem;
|
||||
GAtChat *pcui;
|
||||
struct ofono_sim *sim;
|
||||
gint sim_state;
|
||||
};
|
||||
|
@ -81,8 +81,8 @@ static void huawei_remove(struct ofono_modem *modem)
|
|||
|
||||
ofono_modem_set_data(modem, NULL);
|
||||
|
||||
g_at_chat_unref(data->chat);
|
||||
g_at_chat_unref(data->event);
|
||||
g_at_chat_unref(data->modem);
|
||||
g_at_chat_unref(data->pcui);
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
|
@ -167,11 +167,11 @@ static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
|
|||
return;
|
||||
|
||||
/* follow sim state */
|
||||
g_at_chat_register(data->event, "^SIMST:", simst_notify,
|
||||
g_at_chat_register(data->pcui, "^SIMST:", simst_notify,
|
||||
FALSE, modem, NULL);
|
||||
|
||||
/* query current sim state */
|
||||
g_at_chat_send(data->chat, "AT^SYSINFO", sysinfo_prefix,
|
||||
g_at_chat_send(data->pcui, "AT^SYSINFO", sysinfo_prefix,
|
||||
sysinfo_cb, modem, NULL);
|
||||
}
|
||||
|
||||
|
@ -199,46 +199,44 @@ static GAtChat *create_port(const char *device)
|
|||
static int huawei_enable(struct ofono_modem *modem)
|
||||
{
|
||||
struct huawei_data *data = ofono_modem_get_data(modem);
|
||||
const char *modem_device, *event_device;
|
||||
const char *modem_device, *pcui_device;
|
||||
|
||||
DBG("%p", modem);
|
||||
|
||||
modem_device = ofono_modem_get_string(modem, "Device");
|
||||
event_device = ofono_modem_get_string(modem, "SecondaryDevice");
|
||||
modem_device = ofono_modem_get_string(modem, "Modem");
|
||||
pcui_device = ofono_modem_get_string(modem, "Pcui");
|
||||
|
||||
if (modem_device == NULL || event_device == NULL)
|
||||
if (modem_device == NULL || pcui_device == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
data->chat = create_port(modem_device);
|
||||
data->modem = create_port(modem_device);
|
||||
|
||||
if (data->chat == NULL)
|
||||
if (data->modem == NULL)
|
||||
return -EIO;
|
||||
|
||||
g_at_chat_add_terminator(data->chat, "COMMAND NOT SUPPORT", -1, FALSE);
|
||||
g_at_chat_add_terminator(data->modem, "COMMAND NOT SUPPORT", -1, FALSE);
|
||||
|
||||
if (getenv("OFONO_AT_DEBUG"))
|
||||
g_at_chat_set_debug(data->chat, huawei_debug, "Modem:");
|
||||
g_at_chat_set_debug(data->modem, huawei_debug, "Modem:");
|
||||
|
||||
data->event = create_port(event_device);
|
||||
data->pcui = create_port(pcui_device);
|
||||
|
||||
if (data->event == NULL) {
|
||||
g_at_chat_unref(data->chat);
|
||||
data->chat = NULL;
|
||||
if (data->pcui == NULL) {
|
||||
g_at_chat_unref(data->modem);
|
||||
data->modem = NULL;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
g_at_chat_add_terminator(data->event,
|
||||
"COMMAND NOT SUPPORT", -1, FALSE);
|
||||
g_at_chat_add_terminator(data->pcui, "COMMAND NOT SUPPORT", -1, FALSE);
|
||||
|
||||
if (getenv("OFONO_AT_DEBUG"))
|
||||
g_at_chat_set_debug(data->event, huawei_debug,
|
||||
"Event:");
|
||||
g_at_chat_set_debug(data->pcui, huawei_debug, "Pcui:");
|
||||
|
||||
data->sim_state = 0;
|
||||
|
||||
g_at_chat_send(data->chat, "ATE0", none_prefix, NULL, NULL, NULL);
|
||||
g_at_chat_send(data->pcui, "ATE0", none_prefix, NULL, NULL, NULL);
|
||||
|
||||
g_at_chat_send(data->chat, "AT+CFUN=1", none_prefix,
|
||||
g_at_chat_send(data->pcui, "AT+CFUN=1", none_prefix,
|
||||
cfun_enable, modem, NULL);
|
||||
|
||||
return -EINPROGRESS;
|
||||
|
@ -251,8 +249,8 @@ static void cfun_disable(gboolean ok, GAtResult *result, gpointer user_data)
|
|||
|
||||
DBG("");
|
||||
|
||||
g_at_chat_unref(data->chat);
|
||||
data->chat = NULL;
|
||||
g_at_chat_unref(data->pcui);
|
||||
data->pcui = NULL;
|
||||
|
||||
if (ok)
|
||||
ofono_modem_set_powered(modem, FALSE);
|
||||
|
@ -264,19 +262,19 @@ static int huawei_disable(struct ofono_modem *modem)
|
|||
|
||||
DBG("%p", modem);
|
||||
|
||||
if (data->event) {
|
||||
g_at_chat_cancel_all(data->event);
|
||||
g_at_chat_unregister_all(data->event);
|
||||
g_at_chat_unref(data->event);
|
||||
data->event = NULL;
|
||||
if (data->modem) {
|
||||
g_at_chat_cancel_all(data->modem);
|
||||
g_at_chat_unregister_all(data->modem);
|
||||
g_at_chat_unref(data->modem);
|
||||
data->modem = NULL;
|
||||
}
|
||||
|
||||
if (!data->chat)
|
||||
if (!data->pcui)
|
||||
return 0;
|
||||
|
||||
g_at_chat_cancel_all(data->chat);
|
||||
g_at_chat_unregister_all(data->chat);
|
||||
g_at_chat_send(data->chat, "AT+CFUN=0", none_prefix,
|
||||
g_at_chat_cancel_all(data->pcui);
|
||||
g_at_chat_unregister_all(data->pcui);
|
||||
g_at_chat_send(data->pcui, "AT+CFUN=0", none_prefix,
|
||||
cfun_disable, modem, NULL);
|
||||
|
||||
return -EINPROGRESS;
|
||||
|
@ -288,44 +286,8 @@ static void huawei_pre_sim(struct ofono_modem *modem)
|
|||
|
||||
DBG("%p", modem);
|
||||
|
||||
ofono_devinfo_create(modem, 0, "atmodem", data->chat);
|
||||
data->sim = ofono_sim_create(modem, 0, "atmodem", data->chat);
|
||||
}
|
||||
|
||||
static void cgreg_notify(GAtResult *result, gpointer user_data)
|
||||
{
|
||||
struct ofono_gprs *gprs = user_data;
|
||||
gboolean ret;
|
||||
int status;
|
||||
|
||||
DBG("");
|
||||
|
||||
ret = at_util_parse_reg_unsolicited(result, "+CGREG:", &status,
|
||||
NULL, NULL, NULL,
|
||||
OFONO_VENDOR_HUAWEI);
|
||||
|
||||
if (ret == FALSE)
|
||||
return;
|
||||
|
||||
ofono_gprs_status_notify(gprs, status);
|
||||
}
|
||||
|
||||
static void rssi_notify(GAtResult *result, gpointer user_data)
|
||||
{
|
||||
struct ofono_netreg *netreg = user_data;
|
||||
GAtResultIter iter;
|
||||
int strength;
|
||||
|
||||
g_at_result_iter_init(&iter, result);
|
||||
|
||||
if (!g_at_result_iter_next(&iter, "^RSSI:"))
|
||||
return;
|
||||
|
||||
if (!g_at_result_iter_next_number(&iter, &strength))
|
||||
return;
|
||||
|
||||
ofono_netreg_strength_notify(netreg,
|
||||
at_util_convert_signal_strength(strength));
|
||||
ofono_devinfo_create(modem, 0, "atmodem", data->pcui);
|
||||
data->sim = ofono_sim_create(modem, 0, "atmodem", data->pcui);
|
||||
}
|
||||
|
||||
static void huawei_post_sim(struct ofono_modem *modem)
|
||||
|
@ -338,27 +300,17 @@ static void huawei_post_sim(struct ofono_modem *modem)
|
|||
DBG("%p", modem);
|
||||
|
||||
netreg = ofono_netreg_create(modem, OFONO_VENDOR_HUAWEI, "atmodem",
|
||||
data->chat);
|
||||
data->pcui);
|
||||
|
||||
ofono_sms_create(modem, OFONO_VENDOR_HUAWEI, "atmodem", data->event);
|
||||
ofono_cbs_create(modem, 0, "atmodem", data->event);
|
||||
ofono_ussd_create(modem, 0, "atmodem", data->event);
|
||||
ofono_sms_create(modem, OFONO_VENDOR_HUAWEI, "atmodem", data->pcui);
|
||||
ofono_cbs_create(modem, 0, "atmodem", data->pcui);
|
||||
ofono_ussd_create(modem, 0, "atmodem", data->pcui);
|
||||
|
||||
gprs = ofono_gprs_create(modem, OFONO_VENDOR_HUAWEI, "atmodem",
|
||||
data->chat);
|
||||
gc = ofono_gprs_context_create(modem, 0, "atmodem", data->chat);
|
||||
gprs = ofono_gprs_create(modem, 0, "atmodem", data->pcui);
|
||||
gc = ofono_gprs_context_create(modem, 0, "atmodem", data->modem);
|
||||
|
||||
if (gprs && gc) {
|
||||
if (gprs && gc)
|
||||
ofono_gprs_add_context(gprs, gc);
|
||||
|
||||
/* huawei has a separate channel for CGREG notifications */
|
||||
g_at_chat_register(data->event, "+CGREG:",
|
||||
cgreg_notify, FALSE, gprs, NULL);
|
||||
|
||||
/* huawei uses non-standard "^RSSI:18" strings */
|
||||
g_at_chat_register(data->event, "^RSSI:",
|
||||
rssi_notify, FALSE, netreg, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static struct ofono_modem_driver huawei_driver = {
|
||||
|
|
Loading…
Reference in New Issue