diff rvinterf/etmsync/readcal.c @ 278:31d056f37647

fc-readcal written, compiles
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 17 Nov 2017 01:22:06 +0000
parents
children 36ae854536e8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/etmsync/readcal.c	Fri Nov 17 01:22:06 2017 +0000
@@ -0,0 +1,270 @@
+/*
+ * This utility reads the RF calibration data out of a TI-based GSM device
+ * using the L1TM protocol over RVTMUX.  Warning: invasive tms 1 and rfpw 7
+ * commands are issued to the target in order to select the band of interest!
+ */
+
+#include <sys/types.h>
+#include <sys/file.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+#include "tm3.h"
+#include "l1tm.h"
+#include "localtypes.h"
+#include "exitcodes.h"
+
+int compal_mode;
+
+extern char *socket_pathname;
+extern char *rvinterf_ttyport, *rvinterf_Bopt, *rvinterf_lopt, *rvinterf_wopt;
+
+/* macro for encoding std and band in rfpw 7 command */
+#define	RFPW_STD_BAND(std,band)	((std) | ((band) << 8))
+
+static struct band {
+	char		*argname;
+	char		*filename;
+	unsigned	rfpw_std_band;
+} bands[] = {
+	{"900",   "900",  RFPW_STD_BAND(6, 0)},
+	{"1800",  "1800", RFPW_STD_BAND(6, 1)},
+	{"1900",  "1900", RFPW_STD_BAND(8, 1)},
+	{"850",   "850",  RFPW_STD_BAND(8, 0)},
+	{"1900s", "1900", RFPW_STD_BAND(3, 0)},
+	{"850s",  "850",  RFPW_STD_BAND(7, 0)},
+	{0,       0,      0}
+};
+
+static void
+write_out_file(filename, data, size)
+	char *filename;
+	u_char *data;
+{
+	int fd;
+
+	fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0666);
+	if (fd < 0) {
+		perror(filename);
+		exit(ERROR_UNIX);
+	}
+	write(fd, data, size);
+	close(fd);
+}
+
+copy_afcdac()
+{
+	u16 datum;
+	u_char bytes[2];
+	int rc;
+
+	rc = do_rfpr(INITIAL_AFC_DAC, &datum);
+	if (rc)
+		exit(rc);
+	datum << 3;
+	bytes[0] = datum;
+	bytes[1] = datum >> 8;
+	write_out_file("afcdac", bytes, 2);
+}
+
+copy_afcparams()
+{
+	u_char table[24];
+	int rc;
+
+	rc = do_rftr(AFC_PARAMS, table, sizeof table);
+	if (rc)
+		exit(rc);
+	write_out_file("afcparams", table, sizeof table);
+}
+
+copy_rx_agcparams(bandname)
+	char *bandname;
+{
+	u_char table[8];
+	char filename[32];
+	int rc;
+
+	rc = do_rftr(RX_AGC_PARAMS, table, sizeof table);
+	if (rc)
+		exit(rc);
+	sprintf(filename, "rx/agcparams.%s", bandname);
+	write_out_file(filename, table, sizeof table);
+}
+
+copy_rx_calchan(bandname)
+	char *bandname;
+{
+	u_char table[40];
+	char filename[32];
+	int rc;
+
+	rc = do_rftr(RX_CAL_CHAN, table, sizeof table);
+	if (rc)
+		exit(rc);
+	sprintf(filename, "rx/calchan.%s", bandname);
+	write_out_file(filename, table, sizeof table);
+}
+
+copy_tx_levels(bandname)
+	char *bandname;
+{
+	u_char table[128];
+	char filename[32];
+	int rc;
+
+	rc = do_rftr(TX_LEVELS, table, sizeof table);
+	if (rc)
+		exit(rc);
+	sprintf(filename, "tx/levels.%s", bandname);
+	write_out_file(filename, table, sizeof table);
+}
+
+copy_tx_calchan(bandname)
+	char *bandname;
+{
+	u_char table[128];
+	char filename[32];
+	int rc;
+
+	rc = do_rftr(TX_CAL_CHAN, table, sizeof table);
+	if (rc)
+		exit(rc);
+	sprintf(filename, "tx/calchan.%s", bandname);
+	write_out_file(filename, table, sizeof table);
+}
+
+copy_tx_ramps(bandname)
+	char *bandname;
+{
+	u_char table[512];
+	char filename[32];
+	int rc, i;
+
+	for (i = 0; i < 16; i++) {
+		rc = do_ttr(i, table + i * 32);
+		if (rc)
+			exit(rc);
+	}
+	sprintf(filename, "tx/ramps.%s", bandname);
+	write_out_file(filename, table, sizeof table);
+}
+
+process_band(bandname)
+	char *bandname;
+{
+	int rc;
+
+	rc = host_mkdir("rx");
+	if (rc)
+		exit(rc);
+	copy_rx_agcparams(bandname);
+	if (!compal_mode)
+		copy_rx_calchan(bandname);
+	rc = host_mkdir("tx");
+	if (rc)
+		exit(rc);
+	copy_tx_levels(bandname);
+	if (!compal_mode)
+		copy_tx_calchan(bandname);
+	copy_tx_ramps(bandname);
+}
+
+single_op_main(argc, argv)
+	char **argv;
+{
+	int rc;
+	char **ap;
+	struct band *tp;
+
+	if (argc < 2) {
+		fprintf(stderr,
+		"usage: fc-readcal [options] output-dir band...\n");
+		exit(ERROR_USAGE);
+	}
+	if (chdir(argv[0]) < 0) {
+		perror(argv[0]);
+		exit(ERROR_UNIX);
+	}
+	rc = do_tms(1);
+	if (rc)
+		exit(rc);
+	for (ap = argv + 1; *ap; ap++) {
+		if (!strcmp(*ap, "afc")) {
+			copy_afcdac();
+			copy_afcparams();
+			continue;
+		}
+		for (tp = bands; tp->argname; tp++)
+			if (!strcmp(*ap, tp->argname))
+				break;
+		if (!tp->argname) {
+			fprintf(stderr, "error: unknown band name \"%s\"\n",
+				*ap);
+			exit(ERROR_USAGE);
+		}
+		rc = do_rfpw(STD_BAND_FLAG, tp->rfpw_std_band);
+		if (rc)
+			exit(rc);
+		process_band(tp->filename);
+	}
+	exit(0);
+}
+
+main(argc, argv)
+	char **argv;
+{
+	extern int optind;
+	extern char *optarg;
+	int c, sopt = 0;
+
+	while ((c = getopt(argc, argv, "B:cl:p:s:w:")) != EOF)
+		switch (c) {
+		case 'B':
+			rvinterf_Bopt = optarg;
+			continue;
+		case 'c':
+			compal_mode++;
+			continue;
+		case 'l':
+			rvinterf_lopt = optarg;
+			continue;
+		case 'p':
+			rvinterf_ttyport = optarg;
+			continue;
+		case 's':
+			socket_pathname = optarg;
+			sopt++;
+			continue;
+		case 'w':
+			rvinterf_wopt = optarg;
+			continue;
+		case '?':
+		default:
+			/* error msg already printed */
+			exit(ERROR_USAGE);
+		}
+	if (rvinterf_ttyport) {
+		if (sopt) {
+			fprintf(stderr,
+			"%s error: -p and -s options are mutually exclusive\n",
+				argv[0]);
+			exit(ERROR_USAGE);
+		}
+		if (compal_mode && !rvinterf_Bopt)
+			rvinterf_Bopt = "57600";
+		launch_rvinterf();
+	} else {
+		if (rvinterf_Bopt || rvinterf_lopt || rvinterf_wopt) {
+			fprintf(stderr,
+"%s error: -B, -l and -w options are meaningful only when launching rvinterf\n",
+				argv[0]);
+			exit(ERROR_USAGE);
+		}
+		connect_local_socket();
+	}
+
+	return single_op_main(argc - optind, argv + optind);
+}