diff options
-rw-r--r-- | packages/gsm/files/extreplychars.patch | 70 | ||||
-rw-r--r-- | packages/gsm/files/getopt-wait-interpreter-ready.patch | 57 | ||||
-rw-r--r-- | packages/gsm/files/libgsmd-tool-fix.patch | 19 | ||||
-rw-r--r-- | packages/gsm/files/mlbuf-in-gsmd-struct.patch | 102 | ||||
-rw-r--r-- | packages/gsm/files/sms-hacks.patch | 820 | ||||
-rw-r--r-- | packages/gsm/files/tihtc-csq-fix.patch | 27 | ||||
-rw-r--r-- | packages/gsm/files/universal-wcdma.patch | 29 | ||||
-rw-r--r-- | packages/gsm/libgsmd_svn.bb | 8 |
8 files changed, 2 insertions, 1130 deletions
diff --git a/packages/gsm/files/extreplychars.patch b/packages/gsm/files/extreplychars.patch deleted file mode 100644 index 8ebc343e27..0000000000 --- a/packages/gsm/files/extreplychars.patch +++ /dev/null @@ -1,70 +0,0 @@ -Index: gsm/src/gsmd/atcmd.c -=================================================================== ---- gsm.orig/src/gsmd/atcmd.c 2007-06-03 10:46:19.000000000 +0200 -+++ gsm/src/gsmd/atcmd.c 2007-06-03 15:54:53.000000000 +0200 -@@ -208,7 +208,7 @@ - * TBD - */ - -- if (buf[0] == '+' || buf[0] == '%') { -+ if (buf[0] == '+' || strchr(g->vendorpl->ext_chars, buf[0])) { - /* an extended response */ - const char *colon = strchr(buf, ':'); - if (!colon) { -@@ -255,7 +255,7 @@ - } - - if (cmd) { -- if (cmd->buf[2] != '+' && cmd->buf[2] != '%') { -+ if (cmd->buf[2] != '+' && strchr(g->vendorpl->ext_chars, cmd->buf[2]) == NULL) { - gsmd_log(GSMD_ERROR, "extd reply to non-extd command?\n"); - return -EINVAL; - } -Index: gsm/src/gsmd/vendor_qc.c -=================================================================== ---- gsm.orig/src/gsmd/vendor_qc.c 2007-06-03 10:46:19.000000000 +0200 -+++ gsm/src/gsmd/vendor_qc.c 2007-06-03 11:45:58.000000000 +0200 -@@ -97,6 +97,7 @@ - - struct gsmd_vendor_plugin gsmd_vendor_plugin = { - .name = "Qualcomm msm6250", -+ .ext_chars = "@", - .num_unsolicit = ARRAY_SIZE(qc_unsolicit), - .unsolicit = qc_unsolicit, - .detect = &qc_detect, -Index: gsm/src/gsmd/vendor_ti.c -=================================================================== ---- gsm.orig/src/gsmd/vendor_ti.c 2007-06-03 10:46:19.000000000 +0200 -+++ gsm/src/gsmd/vendor_ti.c 2007-06-03 11:45:58.000000000 +0200 -@@ -303,6 +303,7 @@ - - struct gsmd_vendor_plugin gsmd_vendor_plugin = { - .name = "TI Calypso", -+ .ext_chars = "%@", - .num_unsolicit = ARRAY_SIZE(ticalypso_unsolicit), - .unsolicit = ticalypso_unsolicit, - .detect = &ticalypso_detect, -Index: gsm/include/gsmd/vendorplugin.h -=================================================================== ---- gsm.orig/include/gsmd/vendorplugin.h 2007-02-16 15:12:40.000000000 +0100 -+++ gsm/include/gsmd/vendorplugin.h 2007-06-03 11:45:58.000000000 +0200 -@@ -12,6 +12,7 @@ - struct gsmd_vendor_plugin { - struct llist_head list; - unsigned char *name; -+ unsigned char *ext_chars; - unsigned int num_unsolicit; - const struct gsmd_unsolicit *unsolicit; - int (*detect)(struct gsmd *g); -Index: gsm/src/gsmd/vendor_tihtc.c -=================================================================== ---- gsm.orig/src/gsmd/vendor_tihtc.c 2007-06-03 15:55:31.000000000 +0200 -+++ gsm/src/gsmd/vendor_tihtc.c 2007-06-03 15:55:43.000000000 +0200 -@@ -298,6 +298,7 @@ - - struct gsmd_vendor_plugin gsmd_vendor_plugin = { - .name = "TI Calypso / HTC firmware", -+ .ext_chars = "%", - .num_unsolicit = ARRAY_SIZE(tihtc_unsolicit), - .unsolicit = tihtc_unsolicit, - .detect = &tihtc_detect, diff --git a/packages/gsm/files/getopt-wait-interpreter-ready.patch b/packages/gsm/files/getopt-wait-interpreter-ready.patch deleted file mode 100644 index 52b0da1183..0000000000 --- a/packages/gsm/files/getopt-wait-interpreter-ready.patch +++ /dev/null @@ -1,57 +0,0 @@ -Index: gsm/src/gsmd/gsmd.c -=================================================================== ---- gsm.orig/src/gsmd/gsmd.c 2007-06-03 11:57:43.000000000 +0200 -+++ gsm/src/gsmd/gsmd.c 2007-06-03 11:57:45.000000000 +0200 -@@ -311,6 +311,7 @@ - { "leak-report", 0, NULL, 'L' }, - { "vendor", 1, NULL, 'v' }, - { "machine", 1, NULL, 'm' }, -+ { "wait", 1, NULL, 'w' }, - { 0, 0, 0, 0 } - }; - -@@ -333,6 +334,7 @@ - "\t-l file\t--logfile file\tSpecify a logfile to log to\n" - "\t-v\t--vendor v\tSpecify GSM modem vendor plugin\n" - "\t-m\t--machine m\tSpecify GSM modem machine plugin\n" -+ "\t-w\t--wait m\tWait for the AT Interpreter Ready message\n" - ); - } - -@@ -362,6 +364,7 @@ - char *logfile = "syslog"; - char *vendor_name = NULL; - char *machine_name = NULL; -+ int wait = -1; - - signal(SIGTERM, sig_handler); - signal(SIGINT, sig_handler); -@@ -374,7 +377,7 @@ - print_header(); - - /*FIXME: parse commandline, set daemonize, device, ... */ -- while ((argch = getopt_long(argc, argv, "FVLdhp:s:l:v:m:", opts, NULL)) != -1) { -+ while ((argch = getopt_long(argc, argv, "FVLdhp:s:l:v:m:w:", opts, NULL)) != -1) { - switch (argch) { - case 'V': - /* FIXME */ -@@ -411,6 +414,9 @@ - case 'm': - machine_name = optarg; - break; -+ case 'w': -+ wait = atoi(optarg); -+ break; - } - } - -@@ -455,6 +461,9 @@ - exit(1); - } - -+ if (wait >= 0) -+ g.interpreter_ready = !wait; -+ - if (atcmd_init(&g, fd) < 0) { - fprintf(stderr, "can't initialize UART device\n"); - exit(1); diff --git a/packages/gsm/files/libgsmd-tool-fix.patch b/packages/gsm/files/libgsmd-tool-fix.patch deleted file mode 100644 index 8938f5a682..0000000000 --- a/packages/gsm/files/libgsmd-tool-fix.patch +++ /dev/null @@ -1,19 +0,0 @@ -Index: gsm/src/util/atcmd.c -=================================================================== ---- gsm.orig/src/util/atcmd.c 2007-07-31 11:44:32.000000000 +0200 -+++ gsm/src/util/atcmd.c 2007-07-31 11:46:44.000000000 +0200 -@@ -91,9 +91,11 @@ - continue; - } - printf("STR=`%s'\n", buf); -+ -+ /* this is a synchronous call for a passthrough -+ * command */ -+ lgsm_passthrough(lgsmh, buf, rbuf, &rlen); -+ printf("RSTR=`%s'\n", rbuf); - } -- /* this is a synchronous call for a passthrough command */ -- lgsm_passthrough(lgsmh, buf, rbuf, &rlen); -- printf("RSTR=`%s'\n", rbuf); - } - } diff --git a/packages/gsm/files/mlbuf-in-gsmd-struct.patch b/packages/gsm/files/mlbuf-in-gsmd-struct.patch deleted file mode 100644 index d46eae8bb3..0000000000 --- a/packages/gsm/files/mlbuf-in-gsmd-struct.patch +++ /dev/null @@ -1,102 +0,0 @@ -Index: gsm/include/gsmd/gsmd.h -=================================================================== ---- gsm.orig/include/gsmd/gsmd.h 2007-07-31 14:07:47.000000000 +0200 -+++ gsm/include/gsmd/gsmd.h 2007-07-31 14:09:02.000000000 +0200 -@@ -74,6 +74,8 @@ - struct gsmd_device_state dev_state; - - struct llist_head operators; /* cached list of operator names */ -+ unsigned int mlbuf_len; -+ unsigned char *mlbuf; /* ml_parse buffer */ - }; - - struct gsmd_user { -Index: gsm/src/gsmd/atcmd.c -=================================================================== ---- gsm.orig/src/gsmd/atcmd.c 2007-07-31 14:06:49.000000000 +0200 -+++ gsm/src/gsmd/atcmd.c 2007-07-31 14:12:33.000000000 +0200 -@@ -175,9 +175,7 @@ - { - struct gsmd *g = ctx; - struct gsmd_atcmd *cmd = NULL; -- static char mlbuf[MLPARSE_BUF_SIZE]; - int rc = 0, final = 0; -- int mlbuf_len; - - DEBUGP("buf=`%s'(%d)\n", buf, len); - -@@ -273,15 +271,15 @@ - - /* it might be a multiline response, so if there's a previous - response, send out mlbuf and start afresh with an empty buffer */ -- if (mlbuf[0] != 0) { -+ if (g->mlbuf[0] != 0) { - if (!cmd->cb) { - gsmd_log(GSMD_NOTICE, "command without cb!!!\n"); - } else { - DEBUGP("Calling cmd->cb()\n"); -- cmd->resp = mlbuf; -+ cmd->resp = g->mlbuf; - rc = cmd->cb(cmd, cmd->ctx, cmd->resp); - DEBUGP("Clearing mlbuf\n"); -- mlbuf[0] = 0; -+ g->mlbuf[0] = 0; - } - } - -@@ -334,16 +332,16 @@ - /* we reach here, if we are at an information response that needs to be - * passed on */ - -- if (mlbuf[0] == 0) { -+ if (g->mlbuf[0] == 0) { - DEBUGP("Filling mlbuf\n"); -- strncat(mlbuf, buf, sizeof(mlbuf)-1); -+ strncat(g->mlbuf, buf, MLPARSE_BUF_SIZE-1); - } else { - DEBUGP("Appending buf to mlbuf\n"); -- mlbuf_len = strlen(mlbuf); -- if (mlbuf_len+1 < sizeof(mlbuf)) { -- mlbuf[mlbuf_len] = '\n'; -- mlbuf[mlbuf_len+1] = '\0'; -- strncat(mlbuf, buf, sizeof(mlbuf)-mlbuf_len-2); -+ g->mlbuf_len = strlen(g->mlbuf); -+ if (g->mlbuf_len+1 < MLPARSE_BUF_SIZE) { -+ g->mlbuf[g->mlbuf_len] = '\n'; -+ g->mlbuf[g->mlbuf_len+1] = '\0'; -+ strncat(g->mlbuf, buf, MLPARSE_BUF_SIZE-g->mlbuf_len-2); - } else { - DEBUGP("response too big for mlbuf!!!\n"); - return -EFBIG; -@@ -365,13 +363,13 @@ - } else { - DEBUGP("Calling final cmd->cb()\n"); - /* send final result code if there is no information response in mlbuf */ -- if (mlbuf[0] == 0) -+ if (g->mlbuf[0] == 0) - cmd->resp = buf; - else -- cmd->resp = mlbuf; -+ cmd->resp = g->mlbuf; - rc = cmd->cb(cmd, cmd->ctx, cmd->resp); - DEBUGP("Clearing mlbuf\n"); -- mlbuf[0] = 0; -+ g->mlbuf[0] = 0; - } - - /* remove from list of currently executing cmds */ -Index: gsm/src/gsmd/gsmd.c -=================================================================== ---- gsm.orig/src/gsmd/gsmd.c 2007-07-31 14:06:47.000000000 +0200 -+++ gsm/src/gsmd/gsmd.c 2007-07-31 14:06:50.000000000 +0200 -@@ -300,6 +300,10 @@ - { - INIT_LLIST_HEAD(&g->users); - -+ g->mlbuf = talloc_array(gsmd_tallocs, unsigned char, MLPARSE_BUF_SIZE); -+ if (!g->mlbuf) -+ return -ENOMEM; -+ - return 0; - } - diff --git a/packages/gsm/files/sms-hacks.patch b/packages/gsm/files/sms-hacks.patch deleted file mode 100644 index ba248449af..0000000000 --- a/packages/gsm/files/sms-hacks.patch +++ /dev/null @@ -1,820 +0,0 @@ -From 3e5832569d3b29a90b29b5d5ac0ffad4765bcff3 Mon Sep 17 00:00:00 2001 -From: Andrzej Zaborowski <balrog@zabor.org> -Date: Fri, 6 Jul 2007 06:55:12 +0200 -Subject: [PATCH] SMS hacks 2 - ---- - include/gsmd/gsmd.h | 8 ++- - include/gsmd/usock.h | 35 ++++++++- - include/gsmd/vendorplugin.h | 2 +- - include/libgsmd/sms.h | 2 +- - src/gsmd/atcmd.c | 130 +++++++++++++++++++------------- - src/gsmd/sms_cb.c | 19 ++++- - src/gsmd/usock.c | 175 +++++++++++++++++++++++++++++++++++++----- - src/gsmd/vendor_ti.c | 2 +- - src/libgsmd/libgsmd_sms.c | 26 +++++-- - 11 files changed, 320 insertions(+), 91 deletions(-) - -Index: gsm/include/gsmd/gsmd.h -=================================================================== ---- gsm.orig/include/gsmd/gsmd.h 2007-07-31 14:09:02.000000000 +0200 -+++ gsm/include/gsmd/gsmd.h 2007-07-31 14:23:32.000000000 +0200 -@@ -27,6 +27,7 @@ - u_int32_t buflen; - u_int16_t id; - u_int8_t flags; -+ char *cur; - char buf[]; - }; - -@@ -36,6 +37,8 @@ - LLPARSE_STATE_IDLE_LF, /* LF before response (V1) */ - LLPARSE_STATE_RESULT, /* within result payload */ - LLPARSE_STATE_RESULT_CR, /* CR after result */ -+ LLPARSE_STATE_PROMPT, /* within a "> " prompt */ -+ LLPARSE_STATE_PROMPT_SPC, /* a complete "> " prompt */ - LLPARSE_STATE_ERROR, /* something went wrong */ - /* ... idle again */ - }; -@@ -52,6 +55,7 @@ - unsigned int flags; - void *ctx; - int (*cb)(const char *buf, int len, void *ctx); -+ int (*prompt_cb)(void *ctx); - char *cur; - char buf[LLPARSE_BUF_SIZE]; - }; -@@ -59,6 +63,7 @@ - struct gsmd; - - #define GSMD_FLAG_V0 0x0001 /* V0 responses to be expected from TA */ -+#define GSMD_FLAG_SMS_FMT 0x0002 /* Use TEXT rather than PDU mode */ - - struct gsmd { - unsigned int flags; -@@ -94,7 +99,8 @@ - - extern int gsmdlog_init(const char *path); - /* write a message to the daemons' logfile */ --void __gsmd_log(int level, const char *file, int line, const char *function, const char *message, ...); -+void __gsmd_log(int level, const char *file, int line, const char *function, const char *message, ...) -+ __attribute__ ((__format__ (__printf__, 5, 6))); - /* macro for logging including filename and line number */ - #define gsmd_log(level, format, args ...) \ - __gsmd_log(level, __FILE__, __LINE__, __FUNCTION__, format, ## args) -Index: gsm/include/gsmd/usock.h -=================================================================== ---- gsm.orig/include/gsmd/usock.h 2007-07-31 13:58:37.000000000 +0200 -+++ gsm/include/gsmd/usock.h 2007-07-31 14:23:32.000000000 +0200 -@@ -139,7 +139,7 @@ - /* for SMS-SUBMIT, SMS-DELIVER */ - enum gsmd_sms_tp_udhi { - GSMD_SMS_TP_UDHI_NO_HEADER = (0<<6), -- GSMD_SMS_TP_UDHI_WTIH_HEADER = (1<<6), -+ GSMD_SMS_TP_UDHI_WITH_HEADER = (1<<6), - }; - - /* SMS delflg from 3GPP TS 07.05, Clause 3.5.4 */ -@@ -160,6 +160,34 @@ - GSMD_PHONEBOOK_GET_SUPPORT = 6, - }; - -+/* Type-of-Address, Numbering Plan Identification field */ -+enum gsmd_toa_npi { -+ GSMD_TOA_NPI_UNKNOWN = 0x0, -+ GSMD_TOA_NPI_ISDN = 0x1, -+ GSMD_TOA_NPI_DATA = 0x3, -+ GSMD_TOA_NPI_TELEX = 0x4, -+ GSMD_TOA_NPI_NATIONAL = 0x8, -+ GSMD_TOA_NPI_PRIVATE = 0x9, -+ GSMD_TOA_NPI_ERMES = 0xa, -+ GSMD_TOA_NPI_RESERVED = 0xf, -+}; -+ -+/* Type-of-Address, Type-of-Number field */ -+enum gsmd_toa_ton { -+ GSMD_TOA_TON_UNKNOWN = (0<<4), -+ GSMD_TOA_TON_INTERNATIONAL = (1<<4), -+ GSMD_TOA_TON_NATIONAL = (2<<4), -+ GSMD_TOA_TON_NETWORK = (3<<4), -+ GSMD_TOA_TON_SUBSCRIBER = (4<<4), -+ GSMD_TOA_TON_ALPHANUMERIC = (5<<4), -+ GSMD_TOA_TON_ABBREVIATED = (6<<4), -+}; -+ -+/* Type-of-Address, bit 7 always 1 */ -+enum gsmd_toa_reserved { -+ GSMD_TOA_RESERVED = (1<<7), -+}; -+ - /* Length from 3GPP TS 04.08, Clause 10.5.4.7 */ - - #define GSMD_ADDR_MAXLEN 32 -@@ -269,6 +297,11 @@ - char user_data[140]; - } __attribute__ ((packed)); - -+struct gsmd_sms_send { -+ struct gsmd_addr addr; -+ struct gsmd_sms payload; -+}; -+ - /* Refer to GSM 07.07 subclause 8.12 */ - struct gsmd_phonebook_readrg { - u_int8_t index1; -Index: gsm/include/gsmd/vendorplugin.h -=================================================================== ---- gsm.orig/include/gsmd/vendorplugin.h 2007-07-31 13:58:38.000000000 +0200 -+++ gsm/include/gsmd/vendorplugin.h 2007-07-31 14:23:32.000000000 +0200 -@@ -12,7 +12,7 @@ - struct gsmd_vendor_plugin { - struct llist_head list; - unsigned char *name; -- unsigned char *ext_chars; -+ char *ext_chars; - unsigned int num_unsolicit; - const struct gsmd_unsolicit *unsolicit; - int (*detect)(struct gsmd *g); -Index: gsm/include/libgsmd/sms.h -=================================================================== ---- gsm.orig/include/libgsmd/sms.h 2007-07-31 13:58:38.000000000 +0200 -+++ gsm/include/libgsmd/sms.h 2007-07-31 14:23:32.000000000 +0200 -@@ -83,7 +83,7 @@ - extern int lgsmd_sms_send(struct lgsm_handle *lh, const struct lgsm_sms *sms); - - /* Write Message to Memory */ --extern int lgsmd_sms_write(struct lgsm_handle *lh, -+extern int lgsmd_sms_write(struct lgsm_handle *lh, - const struct lgsm_sms_write *sms_write); - - /* Packing of 7-bit characters, refer to GSM 03.38 subclause 6.1.2.1.1 */ -Index: gsm/src/gsmd/atcmd.c -=================================================================== ---- gsm.orig/src/gsmd/atcmd.c 2007-07-31 14:13:00.000000000 +0200 -+++ gsm/src/gsmd/atcmd.c 2007-07-31 14:23:32.000000000 +0200 -@@ -82,9 +82,12 @@ - - switch (llp->state) { - case LLPARSE_STATE_IDLE: -+ case LLPARSE_STATE_PROMPT_SPC: - if (llp->flags & LGSM_ATCMD_F_EXTENDED) { - if (byte == '\r') - llp->state = LLPARSE_STATE_IDLE_CR; -+ else if (byte == '>') -+ llp->state = LLPARSE_STATE_PROMPT; - else { - #ifdef STRICT - llp->state = LLPARSE_STATE_ERROR; -@@ -108,6 +111,8 @@ - /* can we really go directly into result_cr ? */ - if (byte == '\r') - llp->state = LLPARSE_STATE_RESULT_CR; -+ else if (byte == '>') -+ llp->state = LLPARSE_STATE_PROMPT; - else { - llp->state = LLPARSE_STATE_RESULT; - ret = llparse_append(llp, byte); -@@ -127,6 +132,16 @@ - memset(llp->buf, 0, LLPARSE_BUF_SIZE); - } - break; -+ case LLPARSE_STATE_PROMPT: -+ if (byte == ' ') -+ llp->state = LLPARSE_STATE_PROMPT_SPC; -+ else { -+ /* this was not a real "> " prompt */ -+ llparse_append(llp, '>'); -+ ret = llparse_append(llp, byte); -+ llp->state = LLPARSE_STATE_RESULT; -+ } -+ break; - case LLPARSE_STATE_ERROR: - break; - } -@@ -147,6 +162,10 @@ - /* FIXME: what to do with return value ? */ - llp->cb(llp->buf, llp->cur - llp->buf, llp->ctx); - } -+ -+ /* if a full SMS-style prompt was received, poke the select */ -+ if (llp->state == LLPARSE_STATE_PROMPT_SPC) -+ llp->prompt_cb(llp->ctx); - } - - return 0; -@@ -175,7 +194,7 @@ - { - struct gsmd *g = ctx; - struct gsmd_atcmd *cmd = NULL; -- int rc = 0, final = 0; -+ int rc = 0; - - DEBUGP("buf=`%s'(%d)\n", buf, len); - -@@ -229,7 +248,6 @@ - DEBUGP("error number %lu\n", err_nr); - if (cmd) - cmd->ret = err_nr; -- final = 1; - goto final_cb; - } - if (!strncmp(buf+1, "CMS ERROR", 9)) { -@@ -239,7 +257,6 @@ - DEBUGP("error number %lu\n", err_nr); - if (cmd) - cmd->ret = err_nr; -- final = 1; - goto final_cb; - } - -@@ -271,7 +288,7 @@ - - /* it might be a multiline response, so if there's a previous - response, send out mlbuf and start afresh with an empty buffer */ -- if (g->mlbuf[0] != 0) { -+ if (g->mlbuf_len) { - if (!cmd->cb) { - gsmd_log(GSMD_NOTICE, "command without cb!!!\n"); - } else { -@@ -279,8 +296,8 @@ - cmd->resp = g->mlbuf; - rc = cmd->cb(cmd, cmd->ctx, cmd->resp); - DEBUGP("Clearing mlbuf\n"); -- g->mlbuf[0] = 0; - } -+ g->mlbuf_len = 0; - } - - /* the current buf will be appended to mlbuf below */ -@@ -299,7 +316,6 @@ - DEBUGP("unspecified error\n"); - if (cmd) - cmd->ret = 4; -- final = 1; - goto final_cb; - } - -@@ -308,7 +324,6 @@ - /* Part of Case 'C' */ - if (cmd) - cmd->ret = 0; -- final = 1; - goto final_cb; - } - -@@ -317,14 +332,12 @@ - if (!strncmp(buf, "NO CARRIER", 11) || - ((g->flags & GSMD_FLAG_V0) && buf[0] == '3')) { - /* Part of Case 'D' */ -- final = 1; - goto final_cb; - } - - if (!strncmp(buf, "BUSY", 4) || - ((g->flags & GSMD_FLAG_V0) && buf[0] == '7')) { - /* Part of Case 'D' */ -- final = 1; - goto final_cb; - } - } -@@ -332,21 +345,13 @@ - /* we reach here, if we are at an information response that needs to be - * passed on */ - -- if (g->mlbuf[0] == 0) { -- DEBUGP("Filling mlbuf\n"); -- strncat(g->mlbuf, buf, MLPARSE_BUF_SIZE-1); -- } else { -- DEBUGP("Appending buf to mlbuf\n"); -- g->mlbuf_len = strlen(g->mlbuf); -- if (g->mlbuf_len+1 < MLPARSE_BUF_SIZE) { -- g->mlbuf[g->mlbuf_len] = '\n'; -- g->mlbuf[g->mlbuf_len+1] = '\0'; -- strncat(g->mlbuf, buf, MLPARSE_BUF_SIZE-g->mlbuf_len-2); -- } else { -- DEBUGP("response too big for mlbuf!!!\n"); -- return -EFBIG; -- } -- } -+ if (g->mlbuf_len) -+ g->mlbuf[g->mlbuf_len ++] = '\n'; -+ DEBUGP("Appending buf to mlbuf\n"); -+ if (len > MLPARSE_BUF_SIZE - g->mlbuf_len) -+ len = MLPARSE_BUF_SIZE - g->mlbuf_len; -+ memcpy(g->mlbuf + g->mlbuf_len, buf, len); -+ g->mlbuf_len += len; - return 0; - - final_cb: -@@ -363,13 +368,16 @@ - } else { - DEBUGP("Calling final cmd->cb()\n"); - /* send final result code if there is no information response in mlbuf */ -- if (g->mlbuf[0] == 0) -- cmd->resp = buf; -- else -+ if (g->mlbuf_len) { - cmd->resp = g->mlbuf; -+ g->mlbuf[g->mlbuf_len] = 0; -+ gsmd_log(GSMD_NOTICE, -+ "the text discarded is %s\n", buf); -+ } else -+ cmd->resp = buf; - rc = cmd->cb(cmd, cmd->ctx, cmd->resp); - DEBUGP("Clearing mlbuf\n"); -- g->mlbuf[0] = 0; -+ g->mlbuf_len = 0; - } - - /* remove from list of currently executing cmds */ -@@ -382,7 +390,15 @@ - g->gfd_uart.when |= GSMD_FD_WRITE; - - return rc; --} -+} -+ -+/* called when the modem asked for a new line of a multiline atcmd */ -+static int atcmd_prompt(void *data) -+{ -+ struct gsmd *g = data; -+ -+ g->gfd_uart.when |= GSMD_FD_WRITE; -+} - - /* callback to be called if [virtual] UART has some data for us */ - static int atcmd_select_cb(int fd, unsigned int what, void *data) -@@ -390,6 +406,7 @@ - int len, rc; - static char rxbuf[1024]; - struct gsmd *g = data; -+ char *cr; - - if (what & GSMD_FD_READ) { - memset(rxbuf, 0, sizeof(rxbuf)); -@@ -413,8 +430,12 @@ - if ((what & GSMD_FD_WRITE) && g->interpreter_ready) { - struct gsmd_atcmd *pos, *pos2; - llist_for_each_entry_safe(pos, pos2, &g->pending_atcmds, list) { -- len = strlen(pos->buf); -- rc = write(fd, pos->buf, strlen(pos->buf)); -+ cr = strchr(pos->cur, '\n'); -+ if (cr) -+ len = cr - pos->cur; -+ else -+ len = pos->buflen; -+ rc = write(fd, pos->cur, len); - if (rc == 0) { - gsmd_log(GSMD_ERROR, "write returns 0, aborting\n"); - break; -@@ -423,27 +444,32 @@ - fd, rc); - return rc; - } -- if (rc < len) { -- gsmd_log(GSMD_FATAL, "short write!!! FIXME!\n"); -- exit(3); -- } -+ if (cr && rc == len) -+ rc ++; /* Skip the \n */ -+ pos->buflen -= rc; -+ pos->cur += rc; - write(fd, "\r", 1); -- /* success: remove from global list of to-be-sent atcmds */ -- llist_del(&pos->list); -- /* append to global list of executing atcmds */ -- llist_add_tail(&pos->list, &g->busy_atcmds); -+ -+ if (!pos->buflen) { -+ /* success: remove from global list of -+ * to-be-sent atcmds */ -+ llist_del(&pos->list); -+ /* append to global list of executing atcmds */ -+ llist_add_tail(&pos->list, &g->busy_atcmds); - - /* we only send one cmd at the moment */ -- g->gfd_uart.when &= ~GSMD_FD_WRITE; - break; -+ } else { -+ /* The write was short or the atcmd has more -+ * lines to send after a "> ". */ -+ if (!(rc < len)) -+ break; -+ } - } -- } - --#if 0 -- if (llist_empty(&g->pending_atcmds)) -+ /* Either pending_atcmds is empty or a command has to wait */ - g->gfd_uart.when &= ~GSMD_FD_WRITE; --#endif -- -+ } - - return 0; - } -@@ -454,10 +480,10 @@ - { - int buflen = strlen(cmd); - struct gsmd_atcmd *atcmd; -- -+ - if (rlen > buflen) - buflen = rlen; -- -+ - atcmd = talloc_size(__atcmd_ctx, sizeof(*atcmd)+ buflen); - if (!atcmd) - return NULL; -@@ -468,6 +494,7 @@ - atcmd->ret = -255; - atcmd->buflen = buflen; - atcmd->buf[buflen-1] = '\0'; -+ atcmd->cur = atcmd->buf; - atcmd->cb = cb; - atcmd->resp = NULL; - strncpy(atcmd->buf, cmd, buflen-1); -@@ -480,8 +507,9 @@ - { - DEBUGP("submitting command `%s'\n", cmd->buf); - -+ if (llist_empty(&g->pending_atcmds)) -+ g->gfd_uart.when |= GSMD_FD_WRITE; - llist_add_tail(&cmd->list, &g->pending_atcmds); -- g->gfd_uart.when |= GSMD_FD_WRITE; - - return 0; - } -@@ -517,9 +545,9 @@ - g->llp.cur = g->llp.buf; - g->llp.len = sizeof(g->llp.buf); - g->llp.cb = &ml_parse; -+ g->llp.prompt_cb = &atcmd_prompt; - g->llp.ctx = g; - g->llp.flags = LGSM_ATCMD_F_EXTENDED; - - return gsmd_register_fd(&g->gfd_uart); --} -- -+} -Index: gsm/src/gsmd/sms_cb.c -=================================================================== ---- gsm.orig/src/gsmd/sms_cb.c 2007-07-31 13:58:37.000000000 +0200 -+++ gsm/src/gsmd/sms_cb.c 2007-07-31 14:23:32.000000000 +0200 -@@ -91,9 +91,6 @@ - if (!ucmd) - return -ENOMEM; - -- -- -- - ucmd->hdr.version = GSMD_PROTO_VERSION; - ucmd->hdr.msg_type = GSMD_MSG_SMS; - ucmd->hdr.msg_subtype = GSMD_SMS_GETMSG_STORAGE; -@@ -188,14 +185,26 @@ - int sms_cb_init(struct gsmd *gsmd) - { - struct gsmd_atcmd *atcmd; -+ char buffer[10]; - - atcmd = atcmd_fill("AT+CSMS=0", NULL, gu, 0); - if (!atcmd) - return -ENOMEM; - atcmd_submit(gsmd, atcmd); - -- /* Switch into "text mode" (Section 3.2.3) */ -- atcdm = atcmd_fill("AT+CMGF=1", 9, &sms_cb_init_cb, gu, 0); -+ /* If text mode, set the encoding */ -+ if (gu->gsmd->flags & GSMD_FLAG_SMS_FMT) { -+ atcmd = atcmd_fill("AT+CSCS=\"IRA\"", 13, NULL, gu, 0); -+ if (!atcmd) -+ return -ENOMEM; -+ atcmd_submit(gsmd, atcmd); -+ } -+ -+ /* Switch into desired mode (Section 3.2.3) */ -+ snprintf(buffer, sizeof(buffer), "AT+CMGF=%i", -+ (gu->gsmd->flags & GSMD_FLAG_SMS_FMT) ? -+ GSMD_SMS_FMT_TEXT : GSMD_SMS_FMT_PDU); -+ atcmd = atcmd_fill(buffer, strlen(buffer), &sms_cb_init_cb, gu, 0); - if (!atcmd) - return -ENOMEM; - -Index: gsm/src/gsmd/usock.c -=================================================================== ---- gsm.orig/src/gsmd/usock.c 2007-07-31 13:58:37.000000000 +0200 -+++ gsm/src/gsmd/usock.c 2007-07-31 14:23:32.000000000 +0200 -@@ -75,7 +75,7 @@ - ucmd->hdr.version = GSMD_PROTO_VERSION; - ucmd->hdr.msg_type = GSMD_MSG_PASSTHROUGH; - ucmd->hdr.msg_subtype = GSMD_PASSTHROUGH_RESP; -- ucmd->hdr.len = strlen(resp)+1; -+ ucmd->hdr.len = rlen; - ucmd->hdr.id = cmd->id; - memcpy(ucmd->buf, resp, ucmd->hdr.len); - -@@ -100,7 +100,7 @@ - - static int usock_rcv_event(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, int len) - { -- u_int32_t *evtmask = (u_int32_t *) ((char *)gph + sizeof(*gph), gph->id); -+ u_int32_t *evtmask = (u_int32_t *) ((char *)gph + sizeof(*gph)); - - if (len < sizeof(*gph) + sizeof(u_int32_t)) - return -EINVAL; -@@ -471,18 +471,15 @@ - - static int sms_send_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) - { -- struct gsmd_user *gu = ctx; -+ struct gsmd_user *gu = (struct gsmd_user *) ctx; - struct gsmd_ucmd *ucmd; -- -- ucmd = gsmd_ucmd_fill(strlen(resp)+1, GSMD_MSG_SMS, -- GSMD_SMS_SEND, 0); -+ -+ ucmd = gsmd_ucmd_fill(strlen(resp) + 1, -+ GSMD_MSG_SMS, GSMD_SMS_SEND, cmd->id); - if (!ucmd) - return -ENOMEM; -- - strcpy(ucmd->buf, resp); -- - usock_cmd_enqueue(ucmd, gu); -- - return 0; - } - -@@ -520,34 +517,142 @@ - return 0; - } - -+int packing_7bit_character(char *src, char *dest) -+{ -+ int i,j = 0; -+ unsigned char ch1, ch2; -+ char tmp[2]; -+ int shift = 0; -+ -+ *dest = '\0'; -+ -+ for ( i=0; i<strlen(src); i++ ) { -+ -+ ch1 = src[i] & 0x7F; -+ ch1 = ch1 >> shift; -+ ch2 = src[(i+1)] & 0x7F; -+ ch2 = ch2 << (7-shift); -+ -+ ch1 = ch1 | ch2; -+ -+ j = strlen(dest); -+ sprintf(tmp, "%X", (ch1 >> 4)); -+ dest[j++] = tmp[0]; -+ sprintf(tmp, "%X", (ch1 & 0x0F)); -+ dest[j++] = tmp[0]; -+ dest[j++] = '\0'; -+ -+ shift++; -+ -+ if ( 7 == shift ) { -+ shift = 0; -+ i++; -+ } -+ } -+ -+ return 0; -+} -+ -+/* Refer to GSM 03.40 subclause 9.2.3.3, for SMS-SUBMIT */ -+static int usock_pdu_make_smssubmit(char *dest, struct gsmd_sms_send *src) -+{ -+ u_int8_t header[10 + GSMD_ADDR_MAXLEN]; -+ int pos = 0, i, coding7bit = 1; -+ -+ /* (Should be optional but some modems require it) SMSC Length octet -+ * is prepended. If omitted or zero, use SMSC stored in the phone. */ -+ header[pos ++] = 0x00; -+ -+ header[pos ++] = -+ GSMD_SMS_TP_MTI_SUBMIT | -+ (0 << 2) | /* Reject Duplicates: 0 */ -+ GSMD_SMS_TP_VPF_NOT_PRESENT | -+ GSMD_SMS_TP_SRR_NOT_REQUEST | -+ GSMD_SMS_TP_UDHI_NO_HEADER | -+ GSMD_SMS_TP_RP_NOT_SET; -+ -+ /* TP-Message-Reference - 00 lets the phone set the number itself */ -+ header[pos ++] = 0x00; -+ -+ header[pos ++] = strlen(src->addr.number); -+ header[pos ++] = src->addr.type; -+ for (i = 0; src->addr.number[i]; i ++) { -+ header[pos] = src->addr.number[i ++] - '0'; -+ if (src->addr.number[i]) -+ header[pos ++] |= (src->addr.number[i] - '0') << 4; -+ else { -+ header[pos ++] |= 0xf0; -+ break; -+ } -+ } -+ -+ /* TP-Protocol-Identifier - 00 means implicit */ -+ header[pos ++] = 0x00; -+ -+ /* TP-Data-Coding-Scheme - 00 for 7-bit default alphabet */ -+ header[pos ++] = coding7bit ? 0x00 : 0x04; -+ -+ /* TP-Validity-Period, if present, would go here */ -+ -+ header[pos ++] = src->payload.length; -+ -+ if (dest) { -+ for (i = 0; i < pos; i ++) { -+ sprintf(dest, "%02X", header[i]); -+ dest += 2; -+ } -+ if (coding7bit) -+ packing_7bit_character(src->payload.data, dest); -+ else -+ for (i = 0; i < src->payload.length; i ++) { -+ sprintf(dest, "%02X", src->payload.data[i]); -+ dest += 2; -+ } -+ } -+ -+ if (coding7bit) -+ return ((src->payload.length * 7 + 7) >> 3) + pos; -+ else -+ return src->payload.length + pos; -+} -+ -+static const char *gsmd_cmgl_stat[] = { -+ "REC UNREAD", "REC READ", "STO UNSENT", "STO SENT", "ALL", -+}; -+ - static int usock_rcv_sms(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, - int len) - { - /* FIXME: TEXT mode support!! */ - struct gsmd_atcmd *cmd = NULL; - struct gsmd_sms_delete *gsd; -- struct gsmd_sms *gs; -+ struct gsmd_sms_send *gss; - struct gsmd_sms_write *gsw; - int *stat, *index; - int atcmd_len; - char buf[1024]; -- -+ - switch (gph->msg_subtype) { - case GSMD_SMS_LIST: - /* FIXME: only support PDU mode!! */ - if(len < sizeof(*gph) + sizeof(int)) - return -EINVAL; -- stat = (int *) ((void *)gph + sizeof(*gph)); -+ stat = (int *) ((void *)gph + sizeof(*gph)); -+ if (*stat < 0 || *stat > 4) -+ return -EINVAL; - -- sprintf(buf, "%d", *stat); -- -- atcmd_len = 1 + strlen("AT+CMGL=") + strlen(buf); -- cmd = atcmd_fill("AT+CMGL=", atcmd_len, -- &sms_list_cb, gu, gph->id); -+ if (gu->gsmd->flags & GSMD_FLAG_SMS_FMT) -+ atcmd_len = sprintf(buf, "AT+CMGL=\"%s\"", -+ gsmd_cmgl_stat[*stat]); -+ else -+ atcmd_len = sprintf(buf, "AT+CMGL=%i", *stat); -+ -+ cmd = atcmd_fill(buf, atcmd_len + 1, -+ &sms_list_cb, gu, gph->id); - if (!cmd) - return -ENOMEM; -- sprintf(cmd->buf, "AT+CMGL=%s", buf); - break; -+ - case GSMD_SMS_READ: - /* FIXME: only support PDU mode!! */ - if(len < sizeof(*gph) + sizeof(int)) -@@ -563,6 +668,34 @@ - return -ENOMEM; - sprintf(cmd->buf, "AT+CMGR=%s", buf); - break; -+ -+ case GSMD_SMS_SEND: -+ if (len < sizeof(*gph) + sizeof(*gss)) -+ return -EINVAL; -+ gss = (struct gsmd_sms_send *) ((void *) gph + sizeof(*gph)); -+ -+ if (gu->gsmd->flags & GSMD_FLAG_SMS_FMT) { -+ atcmd_len = sprintf(buf, "AT+CMGS=\"%s\"\n%.*s", -+ gss->addr.number, -+ gss->payload.length, -+ gss->payload.data); -+ } else { -+ atcmd_len = sprintf(buf, "AT+CMGS=%i\n", -+ usock_pdu_make_smssubmit(NULL, -+ gss) - 1); -+ atcmd_len += usock_pdu_make_smssubmit(buf + atcmd_len, -+ gss) * 2; -+ } -+ buf[atcmd_len ++] = 26; /* ^Z ends the message */ -+ buf[atcmd_len ++] = 0; -+ -+ cmd = atcmd_fill(buf, atcmd_len, &sms_send_cb, gu, gph->id); -+ if (!cmd) -+ return -ENOMEM; -+ break; -+ case GSMD_SMS_WRITE: -+ gsmd_log(GSMD_DEBUG, "sms write\n"); -+ break; - #if 0 - case GSMD_SMS_SEND: - /* FIXME: only support PDU mode!! */ -@@ -610,8 +743,8 @@ - default: - return -EINVAL; - } -- -- gsmd_log(GSMD_DEBUG, "%s\n", cmd->buf); -+ -+ gsmd_log(GSMD_DEBUG, "%s\n", cmd ? cmd->buf : 0); - if (cmd) - return atcmd_submit(gu->gsmd, cmd); - else -@@ -867,7 +1000,7 @@ - [GSMD_MSG_PIN] = &usock_rcv_pin, - [GSMD_MSG_PHONE] = &usock_rcv_phone, - [GSMD_MSG_NETWORK] = &usock_rcv_network, -- [GSMD_MSG_SMS] = &usock_rcv_sms, -+ [GSMD_MSG_SMS] = &usock_rcv_sms, - //[GSMD_MSG_PHONEBOOK] = &usock_rcv_phonebook, - }; - -Index: gsm/src/gsmd/vendor_ti.c -=================================================================== ---- gsm.orig/src/gsmd/vendor_ti.c 2007-07-31 13:58:37.000000000 +0200 -+++ gsm/src/gsmd/vendor_ti.c 2007-07-31 14:23:32.000000000 +0200 -@@ -277,7 +277,7 @@ - - static int ticalypso_initsettings(struct gsmd *g) - { -- int rc; -+ int rc = 0; - struct gsmd_atcmd *cmd; - - /* use +CTZR: to report time zone changes */ -Index: gsm/src/libgsmd/libgsmd_sms.c -=================================================================== ---- gsm.orig/src/libgsmd/libgsmd_sms.c 2007-07-31 13:58:37.000000000 +0200 -+++ gsm/src/libgsmd/libgsmd_sms.c 2007-07-31 14:23:32.000000000 +0200 -@@ -83,19 +83,33 @@ - return 0; - } - --int lgsmd_sms_send(struct lgsm_handle *lh, -- const struct lgsm_sms *sms) -+#ifndef MIN -+# define MIN(a,b) (((a) < (b)) ? (a) : (b)) -+#endif -+ -+int lgsmd_sms_send(struct lgsm_handle *lh, -+ const struct lgsm_sms *sms) - { - /* FIXME: only support PDU mode */ - struct gsmd_msg_hdr *gmh; -- struct gsmd_sms *gs; -+ struct gsmd_sms_send *gss; - int rc; - - gmh = lgsm_gmh_fill(GSMD_MSG_SMS, -- GSMD_SMS_SEND, sizeof(*gs)); -+ GSMD_SMS_SEND, sizeof(*gss)); - if (!gmh) - return -ENOMEM; -- gs = (struct gsmd_sms *) gmh->data; -+ gss = (struct gsmd_sms_send *) gmh->data; -+ -+ gss->addr.type = -+ GSMD_TOA_NPI_ISDN | -+ GSMD_TOA_TON_UNKNOWN | -+ GSMD_TOA_RESERVED; -+ strncpy(gss->addr.number, sms->addr, sizeof(gss->addr.number)); -+ -+ gss->payload.length = -+ MIN(strlen(sms->data), sizeof(gss->payload.data)); -+ memcpy(gss->payload.data, sms->data, gss->payload.length); - - rc = lgsm_send(lh, gmh); - if (rc < gmh->len + sizeof(*gmh)) { -@@ -108,7 +122,7 @@ - return 0; - } - --int lgsmd_sms_write(struct lgsm_handle *lh, -+int lgsmd_sms_write(struct lgsm_handle *lh, - const struct lgsm_sms_write *sms_write) - { - /* FIXME: only support PDU mode */ diff --git a/packages/gsm/files/tihtc-csq-fix.patch b/packages/gsm/files/tihtc-csq-fix.patch deleted file mode 100644 index 3346d85809..0000000000 --- a/packages/gsm/files/tihtc-csq-fix.patch +++ /dev/null @@ -1,27 +0,0 @@ -Index: gsm/src/gsmd/vendor_tihtc.c -=================================================================== ---- gsm.orig/src/gsmd/vendor_tihtc.c 2007-06-03 16:26:39.000000000 +0200 -+++ gsm/src/gsmd/vendor_tihtc.c 2007-06-03 16:26:41.000000000 +0200 -@@ -90,6 +90,8 @@ - struct gsmd_evt_auxdata *aux; - struct gsmd_ucmd *ucmd = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_SIGNAL, - sizeof(*aux)); -+ static int rssi_table[] = { 0,5,10,15,20,25,99 }; -+ unsigned int i; - - DEBUGP("entering htccsq_parse param=`%s'\n", param); - if (!ucmd) -@@ -98,9 +100,10 @@ - - aux = (struct gsmd_evt_auxdata *) ucmd->buf; - -- /* FIXME: contains values 1-5, should be mapped to 0-31 somehow? */ -- /* 2 --> 11 */ -- aux->u.signal.sigq.rssi = atoi(buf); -+ i = atoi(buf); -+ if (i > 6) -+ i = 6; -+ aux->u.signal.sigq.rssi = rssi_table[atoi(buf)]; - aux->u.signal.sigq.ber = 99; - - DEBUGP("sending EVT_SIGNAL\n"); diff --git a/packages/gsm/files/universal-wcdma.patch b/packages/gsm/files/universal-wcdma.patch deleted file mode 100644 index a162ce2326..0000000000 --- a/packages/gsm/files/universal-wcdma.patch +++ /dev/null @@ -1,29 +0,0 @@ -Index: gsm/src/gsmd/vendor_qc.c -=================================================================== ---- gsm.orig/src/gsmd/vendor_qc.c 2007-06-13 20:13:47.000000000 +0200 -+++ gsm/src/gsmd/vendor_qc.c 2007-06-13 20:45:19.000000000 +0200 -@@ -69,8 +69,15 @@ - return -EIO; - } - -+static int wcdma_parse(char *buf, int len, const char *param, -+ struct gsmd *gsmd) -+{ -+ return 0; -+} -+ - static const struct gsmd_unsolicit qc_unsolicit[] = { - { "@HTCCSQ", &htccsq_parse }, /* Signal Quality */ -+ { "[WCDMA]", &wcdma_parse }, /* ignore [WCDMA] messages */ - - /* FIXME: parse the below and generate the respective events */ - -@@ -97,7 +109,7 @@ - - struct gsmd_vendor_plugin gsmd_vendor_plugin = { - .name = "Qualcomm msm6250", -- .ext_chars = "@", -+ .ext_chars = "@[", - .num_unsolicit = ARRAY_SIZE(qc_unsolicit), - .unsolicit = qc_unsolicit, - .detect = &qc_detect, diff --git a/packages/gsm/libgsmd_svn.bb b/packages/gsm/libgsmd_svn.bb index 951be7fc31..ba7c07a603 100644 --- a/packages/gsm/libgsmd_svn.bb +++ b/packages/gsm/libgsmd_svn.bb @@ -4,17 +4,13 @@ LICENSE = "GPL LGPL" SECTION = "libs/gsm" PROVIDES += "gsmd" PV = "0.1+svn${SRCDATE}" -PR = "r18" +PR = "r19" SRC_URI_OVERRIDES_PACKAGE_ARCH = "1" SRC_URI = "svn://svn.openmoko.org/trunk/src/target;module=gsm;proto=http \ file://gsmd \ - file://default \ - file://extreplychars.patch;patch=1 \ - file://getopt-wait-interpreter-ready.patch;patch=1 \ - file://tihtc-csq-fix.patch;patch=1 \ - file://universal-wcdma.patch;patch=1" + file://default" S = "${WORKDIR}/gsm" inherit autotools pkgconfig update-rc.d |