r3994 - trunk/src/target/gsm/src/gsmd

erin_yueh at sita.openmoko.org erin_yueh at sita.openmoko.org
Thu Jan 31 10:41:50 CET 2008


Author: erin_yueh
Date: 2008-01-31 10:41:45 +0100 (Thu, 31 Jan 2008)
New Revision: 3994

Added:
   trunk/src/target/gsm/src/gsmd/machine_telit.c
   trunk/src/target/gsm/src/gsmd/vendor_telit.c
Modified:
   trunk/src/target/gsm/src/gsmd/Makefile.am
Log:
gsmd: Patch for Telit GM862 GSM modem (Florian Boor)



Modified: trunk/src/target/gsm/src/gsmd/Makefile.am
===================================================================
--- trunk/src/target/gsm/src/gsmd/Makefile.am	2008-01-31 09:23:37 UTC (rev 3993)
+++ trunk/src/target/gsm/src/gsmd/Makefile.am	2008-01-31 09:41:45 UTC (rev 3994)
@@ -25,10 +25,12 @@
 plugin_LTLIBRARIES = libgsmd-machine_generic.la \
 		     libgsmd-machine_tihtc.la \
 		     libgsmd-machine_gta01.la \
+		     libgsmd-machine_telit.la \
 		     libgsmd-vendor_ti.la \
 		     libgsmd-vendor_tihtc.la \
 		     libgsmd-vendor_qc.la \
-		     libgsmd-vendor_bcm.la
+		     libgsmd-vendor_bcm.la \
+		     libgsmd-vendor_telit.la
 
 libgsmd_machine_generic_la_SOURCES = machine_generic.c
 libgsmd_machine_generic_la_LDFLAGS = -module
@@ -36,6 +38,8 @@
 libgsmd_machine_tihtc_la_LDFLAGS = -module
 libgsmd_machine_gta01_la_SOURCES = machine_gta01.c
 libgsmd_machine_gta01_la_LDFLAGS = -module
+libgsmd_machine_telit_la_SOURCES = machine_telit.c
+libgsmd_machine_telit_la_LDFLAGS = -module
 
 libgsmd_vendor_ti_la_SOURCES = vendor_ti.c
 libgsmd_vendor_ti_la_LDFLAGS = -module
@@ -45,6 +49,8 @@
 libgsmd_vendor_qc_la_LDFLAGS = -module
 libgsmd_vendor_bcm_la_SOURCES = vendor_bcm.c
 libgsmd_vendor_bcm_la_LDFLAGS = -module
+libgsmd_vendor_telit_la_SOURCES = vendor_telit.c
+libgsmd_vendor_telit_la_LDFLAGS = -module
 
 
 noinst_HEADERS = gsmd.h

Added: trunk/src/target/gsm/src/gsmd/machine_telit.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/machine_telit.c	2008-01-31 09:23:37 UTC (rev 3993)
+++ trunk/src/target/gsm/src/gsmd/machine_telit.c	2008-01-31 09:41:45 UTC (rev 3994)
@@ -0,0 +1,103 @@
+/* Telit GM862 / RS323 machine plugin
+ *
+ * (c) 2008 Florian Boor <florian at kernelconcepts.de>
+ *
+ * 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 GSMD_MODEM_POWEROFF_TIMEOUT 6
+
+static void poweroff_timeout(struct gsmd_timer *tmr, void *data) 
+{
+	exit(0);
+}
+
+static struct gsmd_timer *poweroff_timer(struct gsmd *g)
+{
+	struct timeval tv;
+	tv.tv_sec = GSMD_MODEM_POWEROFF_TIMEOUT;
+	tv.tv_usec = 0;
+	DEBUGP("Create power off timer\n");
+
+	return gsmd_timer_create(&tv, &poweroff_timeout, g);
+}
+
+static int telit_detect(struct gsmd *g)
+{
+	return 1; /* not yet implemented */
+}
+
+static int telit_init(struct gsmd *g, int fd)
+{
+    /* We assume the modem has been turned on manually using the S3
+       baseboard or on device startup. */
+	g->interpreter_ready = 1;
+    
+	return 0;
+}
+
+static int telit_power(struct gsmd *g, int power)
+{
+	struct gsmd_atcmd *cmd = NULL;
+
+	switch (power) {
+		case GSMD_MODEM_POWERUP:
+			break;
+
+		case GSMD_MODEM_POWERDOWN:
+			cmd = atcmd_fill("AT#SHDN", 7 + 1, NULL,
+					g, 0, poweroff_timer);
+
+			if (!cmd)
+				return -ENOMEM;
+
+			llist_add_tail(&cmd->list, &g->pending_atcmds);
+			if (llist_empty(&g->busy_atcmds) && 
+					!llist_empty(&g->pending_atcmds)) {
+				atcmd_wake_pending_queue(g);
+			}
+			break;
+
+		default:
+			return -EINVAL;
+	}
+
+	return 0;
+}
+
+struct gsmd_machine_plugin gsmd_machine_plugin = {
+	.name = "Telit GM862",
+	.power = telit_power,
+	.ex_submit = NULL,
+	.detect = &telit_detect,
+	.init = &telit_init,
+};

Added: trunk/src/target/gsm/src/gsmd/vendor_telit.c
===================================================================
--- trunk/src/target/gsm/src/gsmd/vendor_telit.c	2008-01-31 09:23:37 UTC (rev 3993)
+++ trunk/src/target/gsm/src/gsmd/vendor_telit.c	2008-01-31 09:41:45 UTC (rev 3994)
@@ -0,0 +1,112 @@
+/* Telit GM862 gsmd plugin
+ *
+ * (c) 2008 Florian Boor <florian at kernelconcepts.de>
+ *
+ * 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, NULL);
+	if (!cmd)
+		return -ENOMEM;
+
+	return atcmd_submit(gsmd, cmd);
+}
+
+static int telit_detect(struct gsmd *g)
+{
+	return 1; /* not yet implemented */
+}
+
+static int telit_initsettings(struct gsmd *g)
+{
+	int rc = 0;
+	struct gsmd_atcmd *cmd;
+
+	/* Get network registration events with full information. */
+	rc |= gsmd_simplecmd(g, "AT+CGREG=2");
+	/* Turn on CLIP. */
+	rc |= gsmd_simplecmd(g, "AT+CLIP=1");
+	/* Enable powersaving. */
+	rc |= gsmd_simplecmd(g, "AT+CFUN=5");
+	/* enable signal quality reports */
+//	rc |= gsmd_simplecmd(g, "AT%HTCCSQ=1");
+
+	return rc;
+}
+
+static int csq_parse(const char *buf, int len, const char *param,
+		     struct gsmd *gsmd)
+{
+	struct gsmd_evt_auxdata *aux;
+	struct gsmd_ucmd *ucmd = usock_build_event(GSMD_MSG_EVENT,
+			GSMD_EVT_SIGNAL, sizeof(*aux));
+
+	DEBUGP("entering csq_parse param=`%s'\n", param);
+	if (!ucmd)
+		return -EINVAL;
+
+	aux = (struct gsmd_evt_auxdata *) ucmd->buf;
+	if (sscanf(param, " %hhi, %hhi",
+				&aux->u.signal.sigq.rssi,
+				&aux->u.signal.sigq.ber) < 2)
+		goto out_free_io;
+
+	usock_evt_send(gsmd, ucmd, GSMD_EVT_SIGNAL);
+	return 0;
+
+out_free_io:
+	talloc_free(ucmd);
+	return -EIO;
+}
+
+static const struct gsmd_unsolicit telit_unsolicit[] = {
+	{ "+CSQ",	&csq_parse },	/* Signal Quality */
+};
+
+struct gsmd_vendor_plugin gsmd_vendor_plugin = {
+	.name = "Telit GM862",
+	.ext_chars = "%#$",
+	.num_unsolicit = ARRAY_SIZE(telit_unsolicit),
+	.unsolicit = telit_unsolicit,
+	.detect = &telit_detect,
+	.initsettings = &telit_initsettings,
+};





More information about the commitlog mailing list