libgsmd: update patches
authorPhilipp Zabel <philipp.zabel@gmail.com>
Tue, 12 Jun 2007 10:26:57 +0000 (10:26 +0000)
committerPhilipp Zabel <philipp.zabel@gmail.com>
Tue, 12 Jun 2007 10:26:57 +0000 (10:26 +0000)
- 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

packages/gsm/files/alive-start-if-interpreter-ready.patch [new file with mode: 0644]
packages/gsm/files/extreplychars.patch [new file with mode: 0644]
packages/gsm/files/getopt-wait-interpreter-ready.patch [new file with mode: 0644]
packages/gsm/files/plugin.patch [deleted file]
packages/gsm/files/qualcomm-extreply.patch [deleted file]
packages/gsm/files/tihtc-csq-fix.patch [new file with mode: 0644]
packages/gsm/libgsmd_svn.bb

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 (file)
index 0000000..20104d2
--- /dev/null
@@ -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 (file)
index 0000000..8ebc343
--- /dev/null
@@ -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 (file)
index 0000000..52b0da1
--- /dev/null
@@ -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 (file)
index 7f455ce..0000000
+++ /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 <common/linux_list.h>
-+#include <gsmd/machineplugin.h>
- #include <gsmd/vendorplugin.h>
- #include <gsmd/select.h>
- #include <gsmd/state.h>
-@@ -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 <common/linux_list.h>
-+#include <gsmd/gsmd.h>
-+
-+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 <philipp.zabel@gmail.com>
-+ *
-+ * 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 <stdlib.h>
-+#include <unistd.h>
-+#include <string.h>
-+#include <stdio.h>
-+#include <errno.h>
-+#include <sys/ioctl.h>
-+
-+#include "gsmd.h"
-+
-+#include <gsmd/gsmd.h>
-+#include <gsmd/usock.h>
-+#include <gsmd/event.h>
-+#include <gsmd/talloc.h>
-+#include <gsmd/extrsp.h>
-+#include <gsmd/machineplugin.h>
-+
-+#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 <philipp.zabel@gmail.com>
-+ *
-+ * 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 <stdlib.h>
-+#include <unistd.h>
-+#include <string.h>
-+#include <stdio.h>
-+#include <errno.h>
-+
-+#include "gsmd.h"
-+
-+#include <gsmd/gsmd.h>
-+#include <gsmd/usock.h>
-+#include <gsmd/event.h>
-+#include <gsmd/talloc.h>
-+#include <gsmd/extrsp.h>
-+#include <gsmd/machineplugin.h>
-+
-+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 <philipp.zabel@gmail.com>
-+ *
-+ * 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 <dlfcn.h>
-+#include <errno.h>
-+#include <stdio.h>
-+#include <string.h>
-+
-+#include <common/linux_list.h>
-+
-+#include "gsmd.h"
-+
-+#include <gsmd/gsmd.h>
-+#include <gsmd/machineplugin.h>
-+
-+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 <philipp.zabel@gmail.com>
-+ * 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 <stdlib.h>
-+#include <unistd.h>
-+#include <string.h>
-+#include <stdio.h>
-+#include <errno.h>
-+
-+#include "gsmd.h"
-+
-+#include <gsmd/gsmd.h>
-+#include <gsmd/usock.h>
-+#include <gsmd/event.h>
-+#include <gsmd/talloc.h>
-+#include <gsmd/extrsp.h>
-+#include <gsmd/atcmd.h>
-+#include <gsmd/vendorplugin.h>
-+#include <gsmd/unsolicited.h>
-+
-+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 <philipp.zabel@gmail.com>
-+ * 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 <stdlib.h>
-+#include <unistd.h>
-+#include <string.h>
-+#include <stdio.h>
-+#include <errno.h>
-+
-+#include "gsmd.h"
-+
-+#include <gsmd/gsmd.h>
-+#include <gsmd/usock.h>
-+#include <gsmd/event.h>
-+#include <gsmd/talloc.h>
-+#include <gsmd/extrsp.h>
-+#include <gsmd/atcmd.h>
-+#include <gsmd/vendorplugin.h>
-+#include <gsmd/unsolicited.h>
-+
-+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 <dlfcn.h>
- #include <errno.h>
-+#include <stdio.h>
-+#include <string.h>
- #include <common/linux_list.h>
-@@ -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 (file)
index 010a8c9..0000000
+++ /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 (file)
index 0000000..3346d85
--- /dev/null
@@ -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");
index 0215bb9..230d4d6 100644 (file)
@@ -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