Paulius Zaleckas wrote:
I have also removed lgsm_get_info declaration since we are not going to use it according to Sean Chiang.

Regards,
Paulius Zaleckas
------------------------------------------------------------------------

Hi Paulius,
Thanks for your patches! I modified some parts to fit gsmd design. Actually, we 
don't need to keep
the phone information in gsmd and needn't to retrieve them in initial settings. 
Why we store IMSI
value in gsmd, it's for bug#1185. Also, if you are interested in more detailed 'gsmd', you may read http://wiki.openmoko.org/wiki/Gsmd/document wiki page.

Hi List,

R4066 is committed for fix atcmd buffer length. R4067 is committed for retrieving phone information.
Regards,
Erin


Index: include/libgsmd/misc.h
===================================================================
--- include/libgsmd/misc.h	(revision 4066)
+++ include/libgsmd/misc.h	(working copy)
@@ -11,20 +11,6 @@
 extern int lgsm_phone_power(struct lgsm_handle *lh, int power);
 extern int lgsm_modem_power(struct lgsm_handle *lh, int power);
 
-enum lgsm_info_type {
-	LGSM_INFO_TYPE_NONE		= 0,
-	LGSM_INFO_TYPE_MANUF		= 1,
-	LGSM_INFO_TYPE_MODEL		= 2,
-	LGSM_INFO_TYPE_REVISION		= 3,
-	LGSM_INFO_TYPE_SERIAL		= 4,
-	LGSM_INFO_TYPE_IMSI		= 5,
-};
-
-/* Get some information about the handset */
-extern int lgsm_get_info(struct lgsm_handle *lh,
-			 enum lgsm_info_type type,
-			 char *ret_string, u_int16_t len);
-
 /* Authenticate to SIM Card using specified null-terminated pin */
 extern int lgsm_pin_auth(struct lgsm_handle *lh, const char *pin);
 
@@ -73,6 +59,14 @@
 
 /* Retrieve IMSI information */
 extern int lgsm_get_imsi(struct lgsm_handle *lh);
+/* Retrieve manufacturer information */
+extern int lgsm_get_manufacturer(struct lgsm_handle *lh);
+/* Retrieve model information */
+extern int lgsm_get_model(struct lgsm_handle *lh);
+/* Retrieve revision information */
+extern int lgsm_get_revision(struct lgsm_handle *lh);
+/* Retrieve serial information */
+extern int lgsm_get_serial(struct lgsm_handle *lh);
 /* Set voice mail number */
 extern int lgsm_voicemail_set(struct lgsm_handle *lh, const char *number);
 /* Get currently configured voice mail number */
Index: include/gsmd/gsmd.h
===================================================================
--- include/gsmd/gsmd.h	(revision 4066)
+++ include/gsmd/gsmd.h	(working copy)
@@ -73,6 +73,7 @@
 #define GSMD_FLAG_SMS_FMT_TEXT	0x0002	/* TODO Use TEXT rather than PDU mode */
 
 #define GSMD_ATCMD_TIMEOUT	60	/* If doesn get respond within 60 secs, discard */
+#define GSMD_MAX_INFO_LEN	64	/* by the standard it should be 2048, way too much :) */
 
 struct gsmd {
 	unsigned int flags;
Index: include/gsmd/usock.h
===================================================================
--- include/gsmd/usock.h	(revision 4066)
+++ include/gsmd/usock.h	(working copy)
@@ -135,6 +135,10 @@
 	GSMD_PHONE_POWERUP	= 1,
 	GSMD_PHONE_POWERDOWN	= 2,
 	GSMD_PHONE_GET_IMSI     = 3,
+	GSMD_PHONE_GET_MANUF	= 4,
+	GSMD_PHONE_GET_MODEL	= 5,
+	GSMD_PHONE_GET_REVISION	= 6,
+	GSMD_PHONE_GET_SERIAL	= 7,
 };
 
 enum gsmd_msg_modem {
Index: src/libgsmd/libgsmd_phone.c
===================================================================
--- src/libgsmd/libgsmd_phone.c	(revision 4066)
+++ src/libgsmd/libgsmd_phone.c	(working copy)
@@ -50,3 +50,23 @@
 	return lgsm_send_simple(lh, GSMD_MSG_PHONE, GSMD_PHONE_GET_IMSI);
 }
 
+int lgsm_get_manufacturer(struct lgsm_handle *lh)
+{
+	return lgsm_send_simple(lh, GSMD_MSG_PHONE, GSMD_PHONE_GET_MANUF);
+}
+
+int lgsm_get_model(struct lgsm_handle *lh)
+{
+	return lgsm_send_simple(lh, GSMD_MSG_PHONE, GSMD_PHONE_GET_MODEL);
+}
+
+int lgsm_get_revision(struct lgsm_handle *lh)
+{
+	return lgsm_send_simple(lh, GSMD_MSG_PHONE, GSMD_PHONE_GET_REVISION);
+}
+
+int lgsm_get_serial(struct lgsm_handle *lh)
+{
+	return lgsm_send_simple(lh, GSMD_MSG_PHONE, GSMD_PHONE_GET_SERIAL);
+}
+
Index: src/gsmd/usock.c
===================================================================
--- src/gsmd/usock.c	(revision 4066)
+++ src/gsmd/usock.c	(working copy)
@@ -613,6 +613,58 @@
 			cmd->id, sizeof(ret), &ret);
 }
 
+static int gsmd_get_manuf_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
+{
+	struct gsmd_user *gu = ctx;
+
+	DEBUGP("cmd = '%s', resp: '%s'\n", cmd->buf, resp);
+	if (strncmp(resp, "+CGMI: ", 7))
+		return -EINVAL;
+	resp += 7;
+	return gsmd_ucmd_submit(gu, GSMD_MSG_PHONE, GSMD_PHONE_GET_MANUF,
+			cmd->id, strlen(resp) + 1, resp);
+	return 0;
+}
+
+static int gsmd_get_model_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
+{
+	struct gsmd_user *gu = ctx;
+
+	DEBUGP("cmd = '%s', resp: '%s'\n", cmd->buf, resp);
+	if (strncmp(resp, "+CGMM: ", 7))
+		return -EINVAL;
+	resp += 7;
+	return gsmd_ucmd_submit(gu, GSMD_MSG_PHONE, GSMD_PHONE_GET_MODEL,
+			cmd->id, strlen(resp) + 1, resp);
+	return 0;
+}
+
+static int gsmd_get_revision_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
+{
+	struct gsmd_user *gu = ctx;
+
+	DEBUGP("cmd = '%s', resp: '%s'\n", cmd->buf, resp);
+	if (strncmp(resp, "+CGMR: ", 7))
+		return -EINVAL;
+	resp += 7;
+	return gsmd_ucmd_submit(gu, GSMD_MSG_PHONE, GSMD_PHONE_GET_REVISION,
+			cmd->id, strlen(resp) + 1, resp);
+	return 0;
+}
+
+static int gsmd_get_serial_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)
+{
+	struct gsmd_user *gu = ctx;
+
+	DEBUGP("cmd = '%s', resp: '%s'\n", cmd->buf, resp);
+	if (strncmp(resp, "+CGSN: ", 7))
+		return -EINVAL;
+	resp += 7;
+	return gsmd_ucmd_submit(gu, GSMD_MSG_PHONE, GSMD_PHONE_GET_SERIAL,
+			cmd->id, strlen(resp) + 1, resp);
+	return 0;
+}
+
 static int usock_rcv_phone(struct gsmd_user *gu, struct gsmd_msg_hdr *gph, 
 			   int len)
 {
@@ -621,18 +673,34 @@
 	switch (gph->msg_subtype) {
 	case GSMD_PHONE_POWERUP:
 		cmd = atcmd_fill("AT+CFUN=1", 9+1,
-				 &phone_powerup_cb, gu, 0, NULL);
+				&phone_powerup_cb, gu, 0, NULL);
 		break;
 
 	case GSMD_PHONE_POWERDOWN:
 		cmd = atcmd_fill("AT+CFUN=0", 9+1,
-				 &phone_powerdown_cb, gu, 0, NULL);
+				&phone_powerdown_cb, gu, 0, NULL);
 		gu->gsmd->dev_state.on = 0;
 		break;
 	case GSMD_PHONE_GET_IMSI:
 		return gsmd_ucmd_submit(gu, GSMD_MSG_PHONE, GSMD_PHONE_GET_IMSI,
 			0, strlen(gu->gsmd->imsi) + 1, gu->gsmd->imsi);
 		break;
+	case GSMD_PHONE_GET_MANUF:
+		cmd = atcmd_fill("AT+CGMI", 7+1,
+				&gsmd_get_manuf_cb, gu, 0, NULL);
+		break;
+	case GSMD_PHONE_GET_MODEL:
+		cmd = atcmd_fill("AT+CGMM", 7+1,
+				&gsmd_get_model_cb, gu, 0, NULL);
+		break;
+	case GSMD_PHONE_GET_REVISION:
+		cmd = atcmd_fill("AT+CGMR", 7+1,
+				&gsmd_get_revision_cb, gu, 0, NULL);
+		break;
+	case GSMD_PHONE_GET_SERIAL:
+		cmd = atcmd_fill("AT+CGSN", 7+1,
+				&gsmd_get_serial_cb, gu, 0, NULL);
+		break;
 
 	default:
 		return -EINVAL;
Index: src/gsmd/gsmd.c
===================================================================
--- src/gsmd/gsmd.c	(revision 4066)
+++ src/gsmd/gsmd.c	(working copy)
@@ -189,6 +189,7 @@
 	/* configure message format as PDU mode*/
 	/* FIXME: TEXT mode support!! */
 	rc |= gsmd_simplecmd(gsmd, "AT+CMGF=0");
+
 	/* reueset imsi */
 	atcmd_submit(gsmd, atcmd_fill("AT+CIMI", 7+1,
 					&gsmd_get_imsi_cb, gsmd, 0, NULL));
Index: src/util/shell.c
===================================================================
--- src/util/shell.c	(revision 4066)
+++ src/util/shell.c	(working copy)
@@ -400,6 +400,22 @@
 		payload = (char *)gmh + sizeof(*gmh);
 		printf("imsi <%s>\n", payload);
 		break;
+	case GSMD_PHONE_GET_MANUF:
+		payload = (char *)gmh + sizeof(*gmh);
+		printf("manufacturer: %s\n", payload);
+		break;
+	case GSMD_PHONE_GET_MODEL:
+		payload = (char *)gmh + sizeof(*gmh);
+		printf("model: %s\n", payload);
+		break;
+	case GSMD_PHONE_GET_REVISION:
+		payload = (char *)gmh + sizeof(*gmh);
+		printf("revision: %s\n", payload);
+		break;
+	case GSMD_PHONE_GET_SERIAL:
+		payload = (char *)gmh + sizeof(*gmh);
+		printf("serial: %s\n", payload);
+		break;
 	case GSMD_PHONE_POWERUP:
 		if (*intresult)
 			printf("Modem power-up failed: %i\n", *intresult);
@@ -551,6 +567,10 @@
 		"\tgvm\tGet Voicemail number\n"
 		"\tsvm\tSet Voicemail number(svm=number)\n"
 		"\tim\tGet imsi\n"
+		"\tmf\tGet manufacturer\n"
+		"\tml\tGet model\n"
+		"\trv\tGet revision\n"
+		"\tsn\tGet serial number\n"
 		"\tcs\tGet Call status\n"
 		"\tgp\tGet PIN status\n"
 		"\tRh\tRelease all held calls (+CHLD=0)\n"
@@ -864,6 +884,22 @@
 				printf("Get imsi\n");
 				lgsm_get_imsi(lgsmh);
 				pending_responses ++;
+			} else if (!strncmp(buf, "mf", 2)) {
+				printf("Get manufacturer\n");
+				lgsm_get_manufacturer(lgsmh);
+				pending_responses ++;
+			} else if (!strncmp(buf, "ml", 2)) {
+				printf("Get model\n");
+				lgsm_get_model(lgsmh);
+				pending_responses ++;
+			} else if (!strncmp(buf, "rv", 2)) {
+				printf("Get revision\n");
+				lgsm_get_revision(lgsmh);
+				pending_responses ++;
+			} else if (!strncmp(buf, "sn", 2)) {
+				printf("Get serial number\n");
+				lgsm_get_serial(lgsmh);
+				pending_responses ++;
 			} else if ( strlen(buf)==1 && !strncmp(buf, "M", 1)) {
 				printf("Modem Power On\n");
 				lgsm_modem_power(lgsmh, 1);
Index: src/gsmd/atcmd.c
===================================================================
--- src/gsmd/atcmd.c	(revision 4061)
+++ src/gsmd/atcmd.c	(working copy)
@@ -619,7 +619,7 @@
 	atcmd->cb = cb;
 	atcmd->resp = NULL;
 	atcmd->timeout = NULL;
-	strlcpy(atcmd->buf, cmd, buflen);
+	strncpy(atcmd->buf, cmd, buflen-1);
 
 	if (!ct)
 		atcmd->create_timer_func = discard_timer; 

Reply via email to