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:
Lars Poeschel 2020-09-01 11:21:11 +02:00 committed by Denis Kenzior
parent a811aca98a
commit 21f148afe9
1 changed files with 62 additions and 2 deletions

View File

@ -45,6 +45,7 @@
#define MAX_CONTEXTS 255
static const char *cgreg_prefix[] = { "+CGREG:", NULL };
static const char *cgerep_prefix[] = { "+CGEREP:", NULL };
static const char *cgdcont_prefix[] = { "+CGDCONT:", NULL };
static const char *cgact_prefix[] = { "+CGACT:", 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);
}
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,
gpointer user_data)
{
@ -702,8 +762,8 @@ retry:
gprs_initialized, gprs, NULL);
break;
default:
g_at_chat_send(gd->chat, "AT+CGEREP=2,1", none_prefix,
gprs_initialized, gprs, NULL);
g_at_chat_send(gd->chat, "AT+CGEREP=?", cgerep_prefix,
at_cgerep_test_cb, gprs, NULL);
break;
}