summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Zabel <philipp.zabel@gmail.com>2007-03-29 14:03:53 +0000
committerPhilipp Zabel <philipp.zabel@gmail.com>2007-03-29 14:03:53 +0000
commit48bb4a727af559b6174c090ab89a958bff80cb42 (patch)
treeeb3461ba82b66b4592617f7ae5180bf2dd907e71
parentc8bf57cbfc56f4d5de1f5ff4e448824a657ba1dd (diff)
libgsmd: add TI/HTC GSM chipset support and ldisc switching support for magician
- this is a temporary measure and will be reverted once machine plugin support is in place
-rw-r--r--packages/gsm/files/magician/ldisc.patch66
-rw-r--r--packages/gsm/files/magician/vendor-tihtc.patch325
-rw-r--r--packages/gsm/libgsmd_svn.bb3
3 files changed, 394 insertions, 0 deletions
diff --git a/packages/gsm/files/magician/ldisc.patch b/packages/gsm/files/magician/ldisc.patch
new file mode 100644
index 0000000000..30d4a8812a
--- /dev/null
+++ b/packages/gsm/files/magician/ldisc.patch
@@ -0,0 +1,66 @@
+Index: gsm/src/gsmd/gsmd.c
+===================================================================
+--- gsm.orig/src/gsmd/gsmd.c 2007-03-29 15:29:31.000000000 +0200
++++ gsm/src/gsmd/gsmd.c 2007-03-29 15:33:07.000000000 +0200
+@@ -32,6 +32,7 @@
+ #define _GNU_SOURCE
+ #include <getopt.h>
+
++#include <sys/ioctl.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+
+@@ -150,6 +151,7 @@
+ { "speed", 1, NULL, 's' },
+ { "logfile", 1, NULL, 'l' },
+ { "hwflow", 0, NULL, 'F' },
++ { "ldisc", 1, NULL, 'D' },
+ { "leak-report", 0, NULL, 'L' },
+ { 0, 0, 0, 0 }
+ };
+@@ -165,6 +167,7 @@
+ "\t-p dev\t--device dev\tSpecify serial device to be used\n"
+ "\t-s spd\t--speed spd\tSpecify speed in bps (9600,38400,115200,...)\n"
+ "\t-F\t--hwflow\tHardware Flow Control (RTS/CTS)\n"
++ "\t-D\t--ldisc num\tSet line discipline (0=N_TTY,...)\n"
+ "\t-L\t--leak-report\tLeak Report of talloc memory allocator\n"
+ "\t-l file\t--logfile file\tSpecify a logfile to log to\n"
+ );
+@@ -191,6 +194,7 @@
+ int daemonize = 0;
+ int bps = 115200;
+ int hwflow = 0;
++ int ldisc = 0;
+ char *device = "/dev/ttyUSB0";
+ char *logfile = "syslog";
+
+@@ -202,7 +206,7 @@
+ gsmd_tallocs = talloc_named_const(NULL, 1, "GSMD");
+
+ /*FIXME: parse commandline, set daemonize, device, ... */
+- while ((argch = getopt_long(argc, argv, "FVLdhp:s:l:", opts, NULL)) != -1) {
++ while ((argch = getopt_long(argc, argv, "FVLdhp:s:l:D:", opts, NULL)) != -1) {
+ switch (argch) {
+ case 'V':
+ /* FIXME */
+@@ -232,6 +236,8 @@
+ fprintf(stderr, "can't open logfile `%s'\n", optarg);
+ exit(2);
+ }
++ case 'D':
++ ldisc = atoi(optarg);
+ break;
+ }
+ }
+@@ -249,6 +255,11 @@
+ exit(1);
+ }
+
++ if (ldisc && ioctl(fd, TIOCSETD, &ldisc) < 0) {
++ fprintf(stderr, "can't set line discipline\n");
++ exit(1);
++ }
++
+ if (gsmd_initialize(&g) < 0) {
+ fprintf(stderr, "internal error\n");
+ exit(1);
diff --git a/packages/gsm/files/magician/vendor-tihtc.patch b/packages/gsm/files/magician/vendor-tihtc.patch
new file mode 100644
index 0000000000..a2f22ffbea
--- /dev/null
+++ b/packages/gsm/files/magician/vendor-tihtc.patch
@@ -0,0 +1,325 @@
+Index: gsm/src/gsmd/vendor_tihtc.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ gsm/src/gsmd/vendor_tihtc.c 2007-03-27 13:12:05.000000000 +0200
+@@ -0,0 +1,294 @@
++/* 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>
++
++#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;
++}
++
++static struct gsmd_vendor_plugin plugin_tihtc = {
++ .name = "TI Calypso / HTC firmware",
++ .num_unsolicit = ARRAY_SIZE(tihtc_unsolicit),
++ .unsolicit = tihtc_unsolicit,
++ .detect = &tihtc_detect,
++ .initsettings = &tihtc_initsettings,
++};
++
++/* FIXME: this will be _init() when we make this a plugin */
++int tihtc_init(void)
++{
++ return gsmd_vendor_plugin_register(&plugin_tihtc);
++}
+Index: gsm/src/gsmd/gsmd.c
+===================================================================
+--- gsm.orig/src/gsmd/gsmd.c 2007-03-27 13:07:59.000000000 +0200
++++ gsm/src/gsmd/gsmd.c 2007-03-27 13:08:08.000000000 +0200
+@@ -276,7 +276,7 @@
+ }
+
+ /* FIXME: do this dynamically */
+- ticalypso_init();
++ tihtc_init();
+
+ gsmd_vendor_plugin_find(&g);
+
+Index: gsm/src/gsmd/Makefile.am
+===================================================================
+--- gsm.orig/src/gsmd/Makefile.am 2007-03-27 13:09:11.000000000 +0200
++++ gsm/src/gsmd/Makefile.am 2007-03-27 13:09:20.000000000 +0200
+@@ -4,7 +4,7 @@
+ 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
++ vendor_ti.c vendor_tihtc.c talloc.c operator_cache.c ext_response.c
+ #gsmd_LDADD = ../libgsmd/libgsmd.la
+ #gsmd_LDFLAGS = -dynamic
+
diff --git a/packages/gsm/libgsmd_svn.bb b/packages/gsm/libgsmd_svn.bb
index 734624b3ff..d84d363f1a 100644
--- a/packages/gsm/libgsmd_svn.bb
+++ b/packages/gsm/libgsmd_svn.bb
@@ -11,6 +11,9 @@ SRC_URI = "svn://svn.openmoko.org/trunk/src/target;module=gsm;proto=http \
file://default"
S = "${WORKDIR}/gsm"
+SRC_URI_append_magician = " file://vendor-tihtc.patch;patch=1 \
+ file://ldisc.patch;patch=1"
+
inherit autotools pkgconfig update-rc.d
INITSCRIPT_NAME = "gsmd"