mirror of git://git.sysmocom.de/ofono
atmodem: Detect usage of AT+CGEREP
Currently AT+CGEREP=2,1 is sent in case we don't know what the modem needs. (default case) Not all modems understand this. So, we first query what the modem supports with AT+CGEREP=? and then use this information to be nice to the modem. This way modems, like the Quectel M95 that do only understand AT+CGEREP=1 do also work nicely.
This commit is contained in:
parent
a811aca98a
commit
21f148afe9
|
@ -45,6 +45,7 @@
|
||||||
#define MAX_CONTEXTS 255
|
#define MAX_CONTEXTS 255
|
||||||
|
|
||||||
static const char *cgreg_prefix[] = { "+CGREG:", NULL };
|
static const char *cgreg_prefix[] = { "+CGREG:", NULL };
|
||||||
|
static const char *cgerep_prefix[] = { "+CGEREP:", NULL };
|
||||||
static const char *cgdcont_prefix[] = { "+CGDCONT:", NULL };
|
static const char *cgdcont_prefix[] = { "+CGDCONT:", NULL };
|
||||||
static const char *cgact_prefix[] = { "+CGACT:", NULL };
|
static const char *cgact_prefix[] = { "+CGACT:", NULL };
|
||||||
static const char *none_prefix[] = { NULL };
|
static const char *none_prefix[] = { NULL };
|
||||||
|
@ -648,6 +649,65 @@ static void gprs_initialized(gboolean ok, GAtResult *result, gpointer user_data)
|
||||||
ofono_gprs_register(gprs);
|
ofono_gprs_register(gprs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void at_cgerep_test_cb(gboolean ok, GAtResult *result,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
struct ofono_gprs *gprs = user_data;
|
||||||
|
struct gprs_data *gd = ofono_gprs_get_data(gprs);
|
||||||
|
GAtResultIter iter;
|
||||||
|
int min, max, arg1 = 0, arg2 = 0;
|
||||||
|
gboolean two_arguments = true;
|
||||||
|
char buf[20];
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
ofono_error("Error querying AT+CGEREP=? Failing...");
|
||||||
|
ofono_gprs_remove(gprs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_at_result_iter_init(&iter, result);
|
||||||
|
|
||||||
|
g_at_result_iter_next(&iter, "+CGEREP:");
|
||||||
|
|
||||||
|
if (!g_at_result_iter_open_list(&iter)) {
|
||||||
|
ofono_error("Malformed reply from AT+CGEREP=? Failing...");
|
||||||
|
ofono_gprs_remove(gprs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (g_at_result_iter_next_range(&iter, &min, &max)) {
|
||||||
|
if ((min <= 1) && (max >= 1))
|
||||||
|
arg1 = 1;
|
||||||
|
|
||||||
|
if ((min <= 2) && (max >= 2))
|
||||||
|
arg1 = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_at_result_iter_close_list(&iter))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (!g_at_result_iter_open_list(&iter)) {
|
||||||
|
two_arguments = false;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (g_at_result_iter_next_range(&iter, &min, &max)) {
|
||||||
|
if ((min <= 1) && (max >= 1))
|
||||||
|
arg2 = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_at_result_iter_close_list(&iter);
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (two_arguments)
|
||||||
|
sprintf(buf, "AT+CGEREP=%u,%u", arg1, arg2);
|
||||||
|
else
|
||||||
|
sprintf(buf, "AT+CGEREP=%u", arg1);
|
||||||
|
|
||||||
|
g_at_chat_send(gd->chat, buf, none_prefix, gprs_initialized, gprs,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void at_cgreg_test_cb(gboolean ok, GAtResult *result,
|
static void at_cgreg_test_cb(gboolean ok, GAtResult *result,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
|
@ -702,8 +762,8 @@ retry:
|
||||||
gprs_initialized, gprs, NULL);
|
gprs_initialized, gprs, NULL);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_at_chat_send(gd->chat, "AT+CGEREP=2,1", none_prefix,
|
g_at_chat_send(gd->chat, "AT+CGEREP=?", cgerep_prefix,
|
||||||
gprs_initialized, gprs, NULL);
|
at_cgerep_test_cb, gprs, NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue