summaryrefslogtreecommitdiffstats
path: root/drivers/atmodem
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2012-11-23 07:09:29 -0600
committerDenis Kenzior <denkenz@gmail.com>2012-11-23 07:22:25 -0600
commit291f4e0bb0e8b03d97bebfe2f871ae16ce0cbdd1 (patch)
treed034013545c7f517a535390ffd91a7f1271297c2 /drivers/atmodem
parent736f44e0d33e1bc1c859be84bf64035bfd56d799 (diff)
downloadofono-291f4e0bb0e8b03d97bebfe2f871ae16ce0cbdd1.tar.bz2
atmodem: Support CRSM with paths
For GET STATUS and READ BINARY variations, support appending of the optional path in the CRSM command
Diffstat (limited to 'drivers/atmodem')
-rw-r--r--drivers/atmodem/sim.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/drivers/atmodem/sim.c b/drivers/atmodem/sim.c
index 4b4817cb..4f241ac2 100644
--- a/drivers/atmodem/sim.c
+++ b/drivers/atmodem/sim.c
@@ -139,7 +139,8 @@ static void at_sim_read_info(struct ofono_sim *sim, int fileid,
{
struct sim_data *sd = ofono_sim_get_data(sim);
struct cb_data *cbd;
- char buf[64];
+ char buf[128];
+ unsigned int len;
if (sd->vendor == OFONO_VENDOR_OPTION_HSO) {
unsigned char access[3] = { 0x00, 0x00, 0x00 };
@@ -153,18 +154,34 @@ static void at_sim_read_info(struct ofono_sim *sim, int fileid,
cbd = cb_data_new(cb, data);
- snprintf(buf, sizeof(buf), "AT+CRSM=192,%i", fileid);
+ len = snprintf(buf, sizeof(buf), "AT+CRSM=192,%i", fileid);
switch (sd->vendor) {
+ default:
+ if (path_len == 0)
+ break;
+
+ /* Fall through */
case OFONO_VENDOR_ZTE:
case OFONO_VENDOR_HUAWEI:
case OFONO_VENDOR_SIERRA:
case OFONO_VENDOR_SPEEDUP:
case OFONO_VENDOR_QUALCOMM_MSM:
- strcat(buf, ",0,0,255"); /* Maximum possible length */
+ /* Maximum possible length */
+ len += sprintf(buf + len, ",0,0,255");
break;
}
+ if (path_len > 0) {
+ len += sprintf(buf + len, ",,\"");
+
+ for (; path_len; path_len--)
+ len += sprintf(buf + len, "%02hhX", *path++);
+
+ buf[len++] = '\"';
+ buf[len] = '\0';
+ }
+
if (g_at_chat_send(sd->chat, buf, crsm_prefix,
at_crsm_info_cb, cbd, g_free) > 0)
return;
@@ -232,10 +249,23 @@ static void at_sim_read_binary(struct ofono_sim *sim, int fileid,
struct sim_data *sd = ofono_sim_get_data(sim);
struct cb_data *cbd = cb_data_new(cb, data);
char buf[64];
+ unsigned int len;
- snprintf(buf, sizeof(buf), "AT+CRSM=176,%i,%i,%i,%i", fileid,
+ len = snprintf(buf, sizeof(buf), "AT+CRSM=176,%i,%i,%i,%i", fileid,
start >> 8, start & 0xff, length);
+ if (path_len > 0) {
+ buf[len++] = ',';
+ buf[len++] = ',';
+ buf[len++] = '\"';
+
+ for (; path_len; path_len--)
+ len += sprintf(buf + len, "%02hhX", *path++);
+
+ buf[len++] = '\"';
+ buf[len] = '\0';
+ }
+
if (g_at_chat_send(sd->chat, buf, crsm_prefix,
at_crsm_read_cb, cbd, g_free) > 0)
return;
@@ -253,7 +283,7 @@ static void at_sim_read_record(struct ofono_sim *sim, int fileid,
{
struct sim_data *sd = ofono_sim_get_data(sim);
struct cb_data *cbd = cb_data_new(cb, data);
- char buf[64];
+ char buf[128];
snprintf(buf, sizeof(buf), "AT+CRSM=178,%i,%i,4,%i", fileid,
record, length);