From e734a3261cb2290387eb20d6fc6871b3e2655313 Mon Sep 17 00:00:00 2001 From: Philipp Zabel Date: Tue, 12 Jun 2007 10:26:57 +0000 Subject: libgsmd: update patches - drop plugin (accepted upstream) and qualcomm-extreply patches - start the modem-alive thread only after the interpreter is ready - add vendor plugin configurable extreply character support - add a command line option to set the initial interpreter_ready state - fix csq readings in the tihtc vendor module --- .../files/alive-start-if-interpreter-ready.patch | 39 + packages/gsm/files/extreplychars.patch | 70 ++ .../gsm/files/getopt-wait-interpreter-ready.patch | 57 ++ packages/gsm/files/plugin.patch | 935 --------------------- packages/gsm/files/qualcomm-extreply.patch | 13 - packages/gsm/files/tihtc-csq-fix.patch | 27 + packages/gsm/libgsmd_svn.bb | 13 +- 7 files changed, 200 insertions(+), 954 deletions(-) create mode 100644 packages/gsm/files/alive-start-if-interpreter-ready.patch create mode 100644 packages/gsm/files/extreplychars.patch create mode 100644 packages/gsm/files/getopt-wait-interpreter-ready.patch delete mode 100644 packages/gsm/files/plugin.patch delete mode 100644 packages/gsm/files/qualcomm-extreply.patch create mode 100644 packages/gsm/files/tihtc-csq-fix.patch (limited to 'packages/gsm') diff --git a/packages/gsm/files/alive-start-if-interpreter-ready.patch b/packages/gsm/files/alive-start-if-interpreter-ready.patch new file mode 100644 index 0000000000..20104d2e3f --- /dev/null +++ b/packages/gsm/files/alive-start-if-interpreter-ready.patch @@ -0,0 +1,39 @@ +Index: gsm/src/gsmd/atcmd.c +=================================================================== +--- gsm.orig/src/gsmd/atcmd.c 2007-06-03 13:24:44.000000000 +0200 ++++ gsm/src/gsmd/atcmd.c 2007-06-03 13:24:46.000000000 +0200 +@@ -185,6 +185,7 @@ + !strcmp(buf, "AT-Command Interpreter ready")) { + g->interpreter_ready = 1; + gsmd_initsettings(g); ++ gmsd_alive_start(g); + return 0; + } + +Index: gsm/src/gsmd/gsmd.c +=================================================================== +--- gsm.orig/src/gsmd/gsmd.c 2007-06-03 13:22:02.000000000 +0200 ++++ gsm/src/gsmd/gsmd.c 2007-06-03 13:22:56.000000000 +0200 +@@ -128,7 +128,7 @@ + gsmd_timer_register(tmr); + } + +-static int gmsd_alive_start(struct gsmd *gsmd) ++int gmsd_alive_start(struct gsmd *gsmd) + { + struct timeval tv; + +@@ -478,10 +478,11 @@ + /* select a vendor plugin */ + gsmd_vendor_plugin_find(&g); + +- if (g.interpreter_ready) ++ if (g.interpreter_ready) { + gsmd_initsettings(&g); + +- gmsd_alive_start(&g); ++ gmsd_alive_start(&g); ++ } + + gsmd_opname_init(&g); + diff --git a/packages/gsm/files/extreplychars.patch b/packages/gsm/files/extreplychars.patch new file mode 100644 index 0000000000..8ebc343e27 --- /dev/null +++ b/packages/gsm/files/extreplychars.patch @@ -0,0 +1,70 @@ +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 new file mode 100644 index 0000000000..52b0da1183 --- /dev/null +++ b/packages/gsm/files/getopt-wait-interpreter-ready.patch @@ -0,0 +1,57 @@ +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/plugin.patch b/packages/gsm/files/plugin.patch deleted file mode 100644 index 7f455ce718..0000000000 --- a/packages/gsm/files/plugin.patch +++ /dev/null @@ -1,935 +0,0 @@ -Index: gsm/include/gsmd/gsmd.h -=================================================================== ---- gsm.orig/include/gsmd/gsmd.h 2007-04-02 09:58:55.000000000 +0200 -+++ gsm/include/gsmd/gsmd.h 2007-04-02 11:03:41.000000000 +0200 -@@ -7,6 +7,7 @@ - - #include - -+#include - #include - #include - #include -@@ -58,12 +59,14 @@ - - struct gsmd { - unsigned int flags; -+ int interpreter_ready; - struct gsmd_fd gfd_uart; - struct gsmd_fd gfd_sock; - struct llparser llp; - struct llist_head users; - struct llist_head pending_atcmds; /* our busy gsmd_atcmds */ - struct llist_head busy_atcmds; /* our busy gsmd_atcmds */ -+ struct gsmd_machine_plugin *machinepl; - struct gsmd_vendor_plugin *vendorpl; - struct gsmd_device_state dev_state; - -Index: gsm/include/gsmd/machineplugin.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gsm/include/gsmd/machineplugin.h 2007-04-02 11:03:41.000000000 +0200 -@@ -0,0 +1,24 @@ -+#ifndef _GSMD_MACHINEPLUG_H -+#define _GSMD_MACHINEPLUG_H -+ -+#ifdef __GSMD__ -+ -+#include -+#include -+ -+struct gsmd; -+ -+struct gsmd_machine_plugin { -+ struct llist_head list; -+ unsigned char *name; -+ int (*detect)(struct gsmd *g); -+ int (*init)(struct gsmd *g, int fd); -+}; -+ -+extern int gsmd_machine_plugin_register(struct gsmd_machine_plugin *pl); -+extern void gsmd_machine_plugin_unregister(struct gsmd_machine_plugin *pl); -+extern int gsmd_machine_plugin_find(struct gsmd *g); -+ -+#endif /* __GSMD__ */ -+ -+#endif -Index: gsm/src/gsmd/machine_tihtc.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gsm/src/gsmd/machine_tihtc.c 2007-04-02 11:03:41.000000000 +0200 -@@ -0,0 +1,71 @@ -+/* TI [Calypso] with HTC firmware machine plugin -+ * -+ * Written by Philipp Zabel -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License along -+ * with this program; if not, write to the Free Software Foundation, Inc., -+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "gsmd.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define N_TIHTC 17 -+ -+static int tihtc_detect(struct gsmd *g) -+{ -+ /* FIXME: do actual detection of machine if we have multiple machines */ -+ return 1; -+} -+ -+static int tihtc_init(struct gsmd *g, int fd) -+{ -+ int ldisc = N_TIHTC; -+ int rc; -+ -+ /* -+ * Himalaya, Blueangel, Alpine and Magican -+ * power up their GSM chipsets when the -+ * tty is opened. Wait for the "AT-Command -+ * Interpreter ready" message before trying -+ * to send commands. -+ */ -+ g->interpreter_ready = 0; -+ -+ /* Set the line discipline to N_TIHTC */ -+ rc = ioctl(fd, TIOCSETD, &ldisc); -+ if (rc < 0) -+ fprintf(stderr, "can't set line discipline\n"); -+ -+ return rc; -+} -+ -+struct gsmd_machine_plugin gsmd_machine_plugin = { -+ .name = "TI Calypso / HTC firmware", -+ .detect = &tihtc_detect, -+ .init = &tihtc_init, -+}; -Index: gsm/src/gsmd/machine_generic.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gsm/src/gsmd/machine_generic.c 2007-04-02 11:03:41.000000000 +0200 -@@ -0,0 +1,61 @@ -+/* generic machine plugin -+ * -+ * Written by Philipp Zabel -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License along -+ * with this program; if not, write to the Free Software Foundation, Inc., -+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include "gsmd.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static int generic_detect(struct gsmd *g) -+{ -+ /* FIXME: do actual detection of machine if we have multiple machines */ -+ return 1; -+} -+ -+static int generic_init(struct gsmd *g, int fd) -+{ -+ int rc; -+ -+ /* -+ * We assume that the GSM chipset can take -+ * input immediately, so we don't have to -+ * wait for the "AT-Command Interpreter ready" -+ * message before trying to send commands. -+ */ -+ g->interpreter_ready = 1; -+ -+ return 0; -+} -+ -+struct gsmd_machine_plugin gsmd_machine_plugin = { -+ .name = "generic", -+ .detect = &generic_detect, -+ .init = &generic_init, -+}; -Index: gsm/src/gsmd/machine.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gsm/src/gsmd/machine.c 2007-04-02 13:43:04.000000000 +0200 -@@ -0,0 +1,140 @@ -+/* gsmd machine plugin core -+ * -+ * Written by Philipp Zabel -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License along -+ * with this program; if not, write to the Free Software Foundation, Inc., -+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include "gsmd.h" -+ -+#include -+#include -+ -+static LLIST_HEAD(machinepl_list); -+ -+int gsmd_machine_plugin_register(struct gsmd_machine_plugin *pl) -+{ -+ llist_add(&pl->list, &machinepl_list); -+ -+ return 0; -+} -+ -+void gsmd_machine_plugin_unregister(struct gsmd_machine_plugin *pl) -+{ -+ llist_del(&pl->list); -+} -+ -+int gsmd_machine_plugin_find(struct gsmd *g) -+{ -+ struct gsmd_machine_plugin *pl; -+ -+ if (g->machinepl) -+ return -EEXIST; -+ -+ llist_for_each_entry(pl, &machinepl_list, list) { -+ if (pl->detect(g) == 1) { -+ DEBUGP("selecting machine plugin \"%s\"\n", pl->name); -+ g->machinepl = pl; -+ return 1; -+ } -+ } -+ -+ return 0; -+} -+ -+int gsmd_machine_plugin_load(char *name) -+{ -+ int rc = -1; -+ void *plugin; -+ struct gsmd_machine_plugin *pl; -+ char buf[128]; -+ -+ DEBUGP("loading machine plugin \"%s\"\n", name); -+ -+ snprintf(buf, sizeof(buf), PLUGINDIR"/libgsmd-machine_%s.so", name); -+ -+ plugin = dlopen(buf, RTLD_LAZY); -+ if (!plugin) { -+ fprintf(stderr, "gsmd_machine_plugin_load: %s\n", dlerror()); -+ return -1; -+ } -+ -+ pl = dlsym(plugin, "gsmd_machine_plugin"); -+ if (pl) -+ rc = gsmd_machine_plugin_register(pl); -+ else -+ dlclose(plugin); -+ -+ return rc; -+} -+ -+/* maybe /etc/gsmd/cpuinfo */ -+struct machines { -+ char *cpuinfo; -+ char *machine; -+ char *vendor; -+} machines[] = { -+ { "GTA01", "generic", "ti" }, -+ { "HTC Blueangel", "tihtc", "tihtc" }, -+ { "HTC Himalaya", "tihtc", "tihtc" }, -+ { "HTC Magician", "tihtc", "tihtc" }, -+ { "HTC Universal", "generic", "qc" }, -+ { NULL, NULL, NULL }, -+}; -+ -+int gsmd_machine_plugin_init(struct gsmd *g, int fd) -+{ -+ FILE *cpuinfo; -+ char buf[1024]; -+ char *line, *machine = NULL; -+ int i, rc; -+ -+ cpuinfo = fopen("/proc/cpuinfo", "r"); -+ fread(buf, sizeof(buf), 1, cpuinfo); -+ fclose(cpuinfo); -+ -+ line = strtok(buf, "\n"); -+ while (line = strtok(NULL, "\n")) { -+ if (strncmp(line, "Hardware\t: ", 11) == 0) { -+ machine = line+11; -+ break; -+ } -+ } -+ /* FIXME: do this dynamically */ -+ if (machine) { -+ for (i = 0; machines[i].cpuinfo; i++) { -+ if (strcmp(machine, machines[i].cpuinfo) == 0) { -+ DEBUGP("detected %s\n", machine); -+ rc = gsmd_machine_plugin_load(machines[i].machine); -+ rc |= gsmd_vendor_plugin_load(machines[i].vendor); -+ return rc; -+ } -+ } -+ } -+ /* load generic machine and all vendor plugins */ -+ rc = gsmd_machine_plugin_load("generic"); -+ gsmd_vendor_plugin_load("ti"); -+ gsmd_vendor_plugin_load("tihtc"); -+ gsmd_vendor_plugin_load("qc"); -+ return rc; -+} -Index: gsm/src/gsmd/vendor_qc.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gsm/src/gsmd/vendor_qc.c 2007-04-02 11:03:41.000000000 +0200 -@@ -0,0 +1,104 @@ -+/* Qualcomm [msm6250] gsmd plugin -+ * -+ * Written by Philipp Zabel -+ * based on vendor_ti.c -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License along -+ * with this program; if not, write to the Free Software Foundation, Inc., -+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include "gsmd.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static int htccsq_parse(char *buf, int len, const char *param, -+ struct gsmd *gsmd) -+{ -+ char *tok; -+ 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 }; /* FIXME */ -+ unsigned int i; -+ -+ DEBUGP("entering htccsq_parse param=`%s'\n", param); -+ if (!ucmd) -+ return -EINVAL; -+ -+ -+ aux = (struct gsmd_evt_auxdata *) ucmd->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"); -+ usock_evt_send(gsmd, ucmd, GSMD_EVT_SIGNAL); -+ -+ return 0; -+ -+out_free_io: -+ free(ucmd); -+ return -EIO; -+} -+ -+static const struct gsmd_unsolicit qc_unsolicit[] = { -+ { "@HTCCSQ", &htccsq_parse }, /* Signal Quality */ -+ -+ /* FIXME: parse the below and generate the respective events */ -+ -+ /* %CGREG: reports extended information about GPRS registration state */ -+}; -+ -+static int qc_detect(struct gsmd *g) -+{ -+ /* FIXME: do actual detection of vendor if we have multiple vendors */ -+ /* open /proc/cpuinfo and check for HTC Universal? */ -+ return 1; -+} -+ -+static int qc_initsettings(struct gsmd *g) -+{ -+ int rc; -+ struct gsmd_atcmd *cmd; -+ -+ /* enable @HTCCSQ: signal quality reports */ -+ rc |= gsmd_simplecmd(g, "AT@HTCCSQ=1"); -+ -+ return rc; -+} -+ -+struct gsmd_vendor_plugin gsmd_vendor_plugin = { -+ .name = "Qualcomm msm6250", -+ .num_unsolicit = ARRAY_SIZE(qc_unsolicit), -+ .unsolicit = qc_unsolicit, -+ .detect = &qc_detect, -+ .initsettings = &qc_initsettings, -+}; -Index: gsm/src/gsmd/Makefile.am -=================================================================== ---- gsm.orig/src/gsmd/Makefile.am 2007-04-02 09:58:55.000000000 +0200 -+++ gsm/src/gsmd/Makefile.am 2007-04-02 13:33:11.000000000 +0200 -@@ -1,11 +1,26 @@ - INCLUDES = $(all_includes) -I$(top_srcdir)/include - AM_CFLAGS = -std=gnu99 -+plugindir = $(libdir)/gsmd - - sbin_PROGRAMS = gsmd - --gsmd_SOURCES = gsmd.c atcmd.c select.c vendor.c usock.c unsolicited.c log.c \ -- vendor_ti.c talloc.c operator_cache.c ext_response.c --#gsmd_LDADD = ../libgsmd/libgsmd.la --#gsmd_LDFLAGS = -dynamic -+gsmd_CFLAGS = -D PLUGINDIR=\"$(plugindir)\" -+gsmd_SOURCES = gsmd.c atcmd.c select.c machine.c vendor.c unsolicited.c log.c \ -+ usock.c talloc.c operator_cache.c ext_response.c -+gsmd_LDADD = -ldl -+gsmd_LDFLAGS = -Wl,--export-dynamic -+ -+plugin_LTLIBRARIES = libgsmd-machine_generic.la \ -+ libgsmd-machine_tihtc.la \ -+ libgsmd-vendor_ti.la \ -+ libgsmd-vendor_tihtc.la \ -+ libgsmd-vendor_qc.la -+ -+libgsmd_machine_generic_la_SOURCES = machine_generic.c -+libgsmd_machine_tihtc_la_SOURCES = machine_tihtc.c -+ -+libgsmd_vendor_ti_la_SOURCES = vendor_ti.c -+libgsmd_vendor_tihtc_la_SOURCES = vendor_tihtc.c -+libgsmd_vendor_qc_la_SOURCES = vendor_qc.c - - noinst_HEADERS = gsmd.h -Index: gsm/src/gsmd/atcmd.c -=================================================================== ---- gsm.orig/src/gsmd/atcmd.c 2007-04-02 11:03:40.000000000 +0200 -+++ gsm/src/gsmd/atcmd.c 2007-04-02 11:03:41.000000000 +0200 -@@ -183,6 +183,7 @@ - * an empty string or that 'ready' string, we need to init the modem */ - if (strlen(buf) == 0 || - !strcmp(buf, "AT-Command Interpreter ready")) { -+ g->interpreter_ready = 1; - gsmd_initsettings(g); - return 0; - } -@@ -370,7 +371,7 @@ - } - - /* write pending commands to UART */ -- if (what & GSMD_FD_WRITE) { -+ 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); -Index: gsm/src/gsmd/vendor_tihtc.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gsm/src/gsmd/vendor_tihtc.c 2007-04-02 13:16:45.000000000 +0200 -@@ -0,0 +1,305 @@ -+/* TI [Calypso] with HTC firmware gsmd plugin -+ * -+ * Written by Philipp Zabel -+ * based on vendor_ti.c -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License along -+ * with this program; if not, write to the Free Software Foundation, Inc., -+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include "gsmd.h" -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+static int gsmd_test_atcb(struct gsmd_atcmd *cmd, void *ctx, char *resp) -+{ -+ printf("`%s' returned `%s'\n", cmd->buf, resp); -+ return 0; -+} -+ -+int gsmd_simplecmd(struct gsmd *gsmd, char *cmdtxt) -+{ -+ struct gsmd_atcmd *cmd; -+ cmd = atcmd_fill(cmdtxt, strlen(cmdtxt)+1, &gsmd_test_atcb, NULL, 0); -+ if (!cmd) -+ return -ENOMEM; -+ -+ return atcmd_submit(gsmd, cmd); -+} -+ -+ -+#if 0 -+#include "vendorplugin.h" -+ -+static int -+ti_getopt(struct gsmd *gh, int optname, void *optval, int *optlen) -+{ -+ switch (optname) { -+ case GSMD_OPT_CIPHER_IND: -+ /* FIXME: send AT%CPRI=? */ -+ break; -+ default: -+ return -EINVAL; -+ } -+} -+ -+static int -+ti_setopt(struct gsmd *gh, int optname, const void *optval, int optlen) -+{ -+ switch (optname) { -+ case GSMD_OPT_CIPHER_IND: -+ /* FIXME: send AT%CPRI= */ -+ break; -+ default: -+ return -EINVAL; -+ } -+} -+ -+#endif -+ -+ -+static int htccsq_parse(char *buf, int len, const char *param, -+ struct gsmd *gsmd) -+{ -+ char *tok; -+ struct gsmd_evt_auxdata *aux; -+ struct gsmd_ucmd *ucmd = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_SIGNAL, -+ sizeof(*aux)); -+ -+ DEBUGP("entering htccsq_parse param=`%s'\n", param); -+ if (!ucmd) -+ return -EINVAL; -+ -+ -+ 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); -+ aux->u.signal.sigq.ber = 99; -+ -+ DEBUGP("sending EVT_SIGNAL\n"); -+ usock_evt_send(gsmd, ucmd, GSMD_EVT_SIGNAL); -+ -+ return 0; -+ -+out_free_io: -+ free(ucmd); -+ return -EIO; -+} -+ -+static int cpri_parse(char *buf, int len, const char *param, struct gsmd *gsmd) -+{ -+ char *tok1, *tok2; -+ -+ tok1 = strtok(buf, ","); -+ if (!tok1) -+ return -EIO; -+ -+ tok2 = strtok(NULL, ","); -+ if (!tok2) { -+ switch (atoi(tok1)) { -+ case 0: -+ gsmd->dev_state.ciph_ind.flags &= ~GSMD_CIPHIND_ACTIVE; -+ break; -+ case 1: -+ gsmd->dev_state.ciph_ind.flags |= GSMD_CIPHIND_ACTIVE; -+ break; -+ case 2: -+ gsmd->dev_state.ciph_ind.flags |= GSMD_CIPHIND_DISABLED_SIM; -+ break; -+ } -+ } else { -+ struct gsmd_evt_auxdata *aux; -+ struct gsmd_ucmd *ucmd = usock_build_event(GSMD_MSG_EVENT, -+ GSMD_EVT_CIPHER, -+ sizeof(*aux)); -+ if (!ucmd) -+ return -ENOMEM; -+ -+ aux = (struct gsmd_evt_auxdata *) ucmd->buf; -+ -+ aux->u.cipher.net_state_gsm = atoi(tok1); -+ aux->u.cipher.net_state_gsm = atoi(tok2); -+ -+ usock_evt_send(gsmd, ucmd, GSMD_EVT_CIPHER); -+ } -+ -+ return 0; -+} -+ -+/* Call Progress Information */ -+static int cpi_parse(char *buf, int len, const char *param, struct gsmd *gsmd) -+{ -+ char *tok; -+ struct gsmd_evt_auxdata *aux; -+ struct gsmd_ucmd *ucmd = usock_build_event(GSMD_MSG_EVENT, -+ GSMD_EVT_OUT_STATUS, -+ sizeof(*aux)); -+ -+ DEBUGP("entering cpi_parse param=`%s'\n", param); -+ if (!ucmd) -+ return -EINVAL; -+ -+ aux = (struct gsmd_evt_auxdata *) ucmd->buf; -+ -+ /* Format: cId, msgType, ibt, tch, dir,[mode],[number],[type],[alpha],[cause],line */ -+ -+ /* call ID */ -+ tok = strtok(buf, ","); -+ if (!tok) -+ goto out_free_io; -+ -+ /* message type (layer 3) */ -+ tok = strtok(NULL, ","); -+ if (!tok) -+ goto out_free_io; -+ aux->u.call_status.prog = atoi(tok); -+ -+ /* in-band tones */ -+ tok = strtok(NULL, ","); -+ if (!tok) -+ goto out_free_io; -+ -+ if (*tok == '1') -+ aux->u.call_status.ibt = 1; -+ else -+ aux->u.call_status.ibt = 0; -+ -+ /* TCH allocated */ -+ tok = strtok(NULL, ","); -+ if (!tok) -+ goto out_free_io; -+ -+ if (*tok == '1') -+ aux->u.call_status.tch = 1; -+ else -+ aux->u.call_status.tch = 0; -+ -+ /* direction */ -+ tok = strtok(NULL, ","); -+ if (!tok) -+ goto out_send; -+ -+ switch (*tok) { -+ case '0': -+ case '1': -+ case '2': -+ case '3': -+ aux->u.call_status.dir = (*tok - '0'); -+ break; -+ default: -+ break; -+ } -+ -+ /* mode */ -+ tok = strtok(NULL, ","); -+ if (!tok) -+ goto out_send; -+ -+out_send: -+ usock_evt_send(gsmd, ucmd, GSMD_EVT_OUT_STATUS); -+ -+ return 0; -+ -+out_free_io: -+ talloc_free(ucmd); -+ return -EIO; -+} -+ -+static const struct gsmd_unsolicit tihtc_unsolicit[] = { -+ { "%HTCCSQ", &htccsq_parse }, /* Signal Quality */ -+ { "%CPRI", &cpri_parse }, /* Ciphering Indication */ -+ { "%CPI", &cpi_parse }, /* Call Progress Information */ -+ -+ /* FIXME: parse the below and generate the respective events */ -+ -+ /* %CGREG: reports extended information about GPRS registration state */ -+}; -+ -+static int cpi_detect_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) -+{ -+ struct gsmd *g = ctx; -+ struct gsm_extrsp *er; -+ -+ if (strncmp(resp, "%CPI: ", 6)) -+ return -EINVAL; -+ resp += 6; -+ -+ er = extrsp_parse(cmd, resp); -+ if (!er) -+ return -EINVAL; -+ -+ if (extrsp_supports(er, 0, 3)) -+ return gsmd_simplecmd(g, "AT%CPI=3"); -+ else if (extrsp_supports(er, 0, 2)) -+ return gsmd_simplecmd(g, "AT%CPI=2"); -+ else -+ DEBUGP("Call Progress Indication mode 2 or 3 not supported!!\n"); -+ -+ talloc_free(er); -+ return 0; -+} -+ -+static int tihtc_detect(struct gsmd *g) -+{ -+ /* FIXME: do actual detection of vendor if we have multiple vendors */ -+ /* open /proc/cpuinfo and check for HTC Magician or HTC Blueangel? */ -+ /* check for N_TIHTC ldisc? or set it ourselves? */ -+ return 1; -+} -+ -+static int tihtc_initsettings(struct gsmd *g) -+{ -+ int rc; -+ struct gsmd_atcmd *cmd; -+ -+ /* use %CGREG */ -+ //rc |= gsmd_simplecmd(g, "AT%CGREG=3"); -+ /* enable %CPRI: ciphering indications */ -+ rc |= gsmd_simplecmd(g, "AT%CPRI=1"); -+ /* enable %HTCCSQ: signal quality reports */ -+ rc |= gsmd_simplecmd(g, "AT%HTCCSQ=1"); -+ /* send unsolicited commands at any time */ -+ rc |= gsmd_simplecmd(g, "AT%CUNS=0"); -+ -+ /* enable %CPI: call progress indication */ -+ cmd = atcmd_fill("AT%CPI=?", 9, &cpi_detect_cb, g, 0); -+ if (cmd) -+ atcmd_submit(g, cmd); -+ -+ return rc; -+} -+ -+struct gsmd_vendor_plugin gsmd_vendor_plugin = { -+ .name = "TI Calypso / HTC firmware", -+ .num_unsolicit = ARRAY_SIZE(tihtc_unsolicit), -+ .unsolicit = tihtc_unsolicit, -+ .detect = &tihtc_detect, -+ .initsettings = &tihtc_initsettings, -+}; -Index: gsm/src/gsmd/vendor_ti.c -=================================================================== ---- gsm.orig/src/gsmd/vendor_ti.c 2007-04-02 09:58:55.000000000 +0200 -+++ gsm/src/gsmd/vendor_ti.c 2007-04-02 11:03:41.000000000 +0200 -@@ -301,16 +301,10 @@ - return rc; - } - --static struct gsmd_vendor_plugin plugin_ticalypso = { -+struct gsmd_vendor_plugin gsmd_vendor_plugin = { - .name = "TI Calypso", - .num_unsolicit = ARRAY_SIZE(ticalypso_unsolicit), - .unsolicit = ticalypso_unsolicit, - .detect = &ticalypso_detect, - .initsettings = &ticalypso_initsettings, - }; -- --/* FIXME: this will be _init() when we make this a plugin */ --int ticalypso_init(void) --{ -- return gsmd_vendor_plugin_register(&plugin_ticalypso); --} -Index: gsm/src/gsmd/gsmd.c -=================================================================== ---- gsm.orig/src/gsmd/gsmd.c 2007-04-02 09:58:55.000000000 +0200 -+++ gsm/src/gsmd/gsmd.c 2007-04-02 13:39:40.000000000 +0200 -@@ -254,6 +254,21 @@ - exit(1); - } - -+ if (gsmd_machine_plugin_init(&g) < 0) { -+ fprintf(stderr, "no machine plugins found\n"); -+ exit(1); -+ } -+ -+ /* select a machine plugin and load possible vendor plugins */ -+ gsmd_machine_plugin_find(&g); -+ -+ /* initialize the machine plugin */ -+ if (g.machinepl->init) -+ if (g.machinepl->init(&g, fd) < 0) { -+ fprintf(stderr, "couldn't initialize machine plugin\n"); -+ exit(1); -+ } -+ - if (atcmd_init(&g, fd) < 0) { - fprintf(stderr, "can't initialize UART device\n"); - exit(1); -@@ -275,12 +290,11 @@ - setsid(); - } - -- /* FIXME: do this dynamically */ -- ticalypso_init(); -- -+ /* select a vendor plugin */ - gsmd_vendor_plugin_find(&g); - -- gsmd_initsettings(&g); -+ if (g.interpreter_ready) -+ gsmd_initsettings(&g); - - gsmd_opname_init(&g); - -Index: gsm/src/gsmd/vendor.c -=================================================================== ---- gsm.orig/src/gsmd/vendor.c 2007-04-02 09:58:55.000000000 +0200 -+++ gsm/src/gsmd/vendor.c 2007-04-02 13:38:38.000000000 +0200 -@@ -20,7 +20,10 @@ - * - */ - -+#include - #include -+#include -+#include - - #include - -@@ -52,6 +55,7 @@ - - llist_for_each_entry(pl, &vendorpl_list, list) { - if (pl->detect(g) == 1) { -+ DEBUGP("selecting vendor plugin \"%s\"\n", pl->name); - g->vendorpl = pl; - return 1; - } -@@ -59,3 +63,29 @@ - - return 0; - } -+ -+int gsmd_vendor_plugin_load(char *name) -+{ -+ int rc = -1; -+ void *lib; -+ struct gsmd_vendor_plugin *pl; -+ char buf[128]; -+ -+ DEBUGP("loading vendor plugin \"%s\"\n", name); -+ -+ snprintf(buf, sizeof(buf), PLUGINDIR"/libgsmd-vendor_%s.so", name); -+ -+ lib = dlopen(buf, RTLD_LAZY); -+ if (!lib) { -+ fprintf(stderr, "gsmd_vendor_plugin_load: %s\n", dlerror()); -+ return -1; -+ } -+ -+ pl = dlsym(lib, "gsmd_vendor_plugin"); -+ if (pl) -+ rc = gsmd_vendor_plugin_register(pl); -+ else -+ dlclose(lib); -+ -+ return rc; -+} diff --git a/packages/gsm/files/qualcomm-extreply.patch b/packages/gsm/files/qualcomm-extreply.patch deleted file mode 100644 index 010a8c9f31..0000000000 --- a/packages/gsm/files/qualcomm-extreply.patch +++ /dev/null @@ -1,13 +0,0 @@ -Index: gsm/src/gsmd/atcmd.c -=================================================================== ---- gsm.orig/src/gsmd/atcmd.c 2007-04-02 09:59:16.000000000 +0200 -+++ gsm/src/gsmd/atcmd.c 2007-04-02 10:10:54.000000000 +0200 -@@ -207,7 +207,7 @@ - * TBD - */ - -- if (buf[0] == '+' || buf[0] == '%') { -+ if (buf[0] == '+' || buf[0] == '%' || buf[0] == '@') { - /* an extended response */ - const char *colon = strchr(buf, ':'); - if (!colon) { diff --git a/packages/gsm/files/tihtc-csq-fix.patch b/packages/gsm/files/tihtc-csq-fix.patch new file mode 100644 index 0000000000..3346d85809 --- /dev/null +++ b/packages/gsm/files/tihtc-csq-fix.patch @@ -0,0 +1,27 @@ +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/libgsmd_svn.bb b/packages/gsm/libgsmd_svn.bb index 0215bb92b9..230d4d6fe5 100644 --- a/packages/gsm/libgsmd_svn.bb +++ b/packages/gsm/libgsmd_svn.bb @@ -4,16 +4,17 @@ LICENSE = "GPL" SECTION = "libs/gsm" PROVIDES += "gsmd" PV = "0.0+svn${SRCDATE}" -PR = "r10" +PR = "r13" SRC_URI = "svn://svn.openmoko.org/trunk/src/target;module=gsm;proto=http \ file://gsmd \ - file://default" -S = "${WORKDIR}/gsm" + file://default \ + file://extreplychars.patch;patch=1 \ + file://getopt-wait-interpreter-ready.patch;patch=1 \ + file://alive-start-if-interpreter-ready.patch;patch=1 \ + file://tihtc-csq-fix.patch;patch=1" -SRC_URI_append_magician = " file://plugin.patch;patch=1" -SRC_URI_append_htcuniversal = " file://plugin.patch;patch=1 \ - file://qualcomm-extreply.patch;patch=1" +S = "${WORKDIR}/gsm" inherit autotools pkgconfig update-rc.d -- cgit 1.2.3-korg