diff options
author | Philipp Zabel <philipp.zabel@gmail.com> | 2007-03-29 14:03:53 +0000 |
---|---|---|
committer | Philipp Zabel <philipp.zabel@gmail.com> | 2007-03-29 14:03:53 +0000 |
commit | 48bb4a727af559b6174c090ab89a958bff80cb42 (patch) | |
tree | eb3461ba82b66b4592617f7ae5180bf2dd907e71 | |
parent | c8bf57cbfc56f4d5de1f5ff4e448824a657ba1dd (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.patch | 66 | ||||
-rw-r--r-- | packages/gsm/files/magician/vendor-tihtc.patch | 325 | ||||
-rw-r--r-- | packages/gsm/libgsmd_svn.bb | 3 |
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" |