diff miscprog/pircalextr.c @ 218:b6a95d35fabc

pircalextr program written, compiles
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 28 May 2017 20:12:14 +0000
parents
children e3bbb8cfbbc0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/miscprog/pircalextr.c	Sun May 28 20:12:14 2017 +0000
@@ -0,0 +1,173 @@
+/*
+ * This program extracts the RF calibration tables from a dump of Pirelli's
+ * factory sector and saves them in FreeCalypso ASCII format.
+ */
+
+#include <sys/types.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <endian.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+u_char factbuf[0x2000];
+
+read_factory_struct(filename)
+	char *filename;
+{
+	int fd;
+	struct stat st;
+
+	fd = open(filename, O_RDONLY);
+	if (fd < 0) {
+		perror(filename);
+		exit(1);
+	}
+	fstat(fd, &st);
+	if (!S_ISREG(st.st_mode)) {
+		fprintf(stderr, "error: %s is not a regular file\n", filename);
+		exit(1);
+	}
+	if (st.st_size != 0x10000) {
+		fprintf(stderr,
+			"error: %s is of the wrong size (64 KiB expected)\n",
+			filename);
+		exit(1);
+	}
+	read(fd, factbuf, sizeof factbuf);
+	close(fd);
+	return(0);
+}
+
+unsigned
+get_u32(bin)
+	u_char *bin;
+{
+	return le32toh(*(uint32_t *)bin);
+}
+
+unsigned
+get_u16(bin)
+	u_char *bin;
+{
+	return le16toh(*(uint16_t *)bin);
+}
+
+get_s16(bin)
+	u_char *bin;
+{
+	int i;
+
+	i = le16toh(*(uint16_t *)bin);
+	if (i >= 32768)
+		i -= 65536;
+	return(i);
+}
+
+void
+write_tx_levels_table(bin, outf)
+	u_char *bin;
+	FILE *outf;
+{
+	int i;
+	u_char *p = bin;
+
+	fputs("rf_table tx-levels\n\n", outf);
+	fputs("# Fields in each entry: apc, ramp_index, chan_cal_index\n\n",
+		outf);
+	for (i = 0; i < 32; i++) {
+		fprintf(outf, "%5u %3u %3u\t# entry %d\n",
+			get_u16(p), p[2], p[3], i);
+		p += 4;
+	}
+}
+
+void
+write_tx_calchan_table(bin, outf)
+	u_char *bin;
+	FILE *outf;
+{
+	int i, j;
+	u_char *p = bin;
+
+	fputs("rf_table tx-calchan\n", outf);
+	for (i = 0; i < 4; i++) {
+		fprintf(outf, "\n# Channel calibration table %d:\n\n", i);
+		for (j = 0; j < 8; j++) {
+			fprintf(outf, "%5u %6d\n", get_u16(p), get_s16(p + 2));
+			p += 4;
+		}
+	}
+}
+
+void
+write_rx_calchan_table(bin, outf)
+	u_char *bin;
+	FILE *outf;
+{
+	int i;
+	u_char *p = bin;
+
+	fputs("rf_table rx-calchan\n\n", outf);
+	for (i = 0; i < 10; i++) {
+		fprintf(outf, "%5u %6d\n", get_u16(p), get_s16(p + 2));
+		p += 4;
+	}
+}
+
+void
+write_rx_agcparams_table(bin, outf)
+	u_char *bin;
+	FILE *outf;
+{
+	fputs("rf_table rx-agc-params\n\n", outf);
+	fprintf(outf, "%5u\t# g_magic\n", get_u16(bin));
+	fprintf(outf, "%5u\t# lna_att\n", get_u16(bin + 2));
+	fprintf(outf, "%5u\t# lna_switch_thr_low\n", get_u16(bin + 4));
+	fprintf(outf, "%5u\t# lna_switch_thr_high\n", get_u16(bin + 6));
+}
+
+struct calmap {
+	unsigned	offset;
+	char		*outfile;
+	void		(*fmtfunc)();
+} pirelli_cal_map[] = {
+	{0x092C, "tx-levels.900",     write_tx_levels_table},
+	{0x09AD, "tx-calchan.900",    write_tx_calchan_table},
+	{0x0C2F, "tx-levels.1800",    write_tx_levels_table},
+	{0x0CB0, "tx-calchan.1800",   write_tx_calchan_table},
+	{0x0F32, "tx-levels.1900",    write_tx_levels_table},
+	{0x0FB3, "tx-calchan.1900",   write_tx_calchan_table},
+	{0x10AF, "rx-calchan.900",    write_rx_calchan_table},
+	{0x10D8, "rx-agcparams.900",  write_rx_agcparams_table},
+	{0x10E1, "rx-calchan.1800",   write_rx_calchan_table},
+	{0x110A, "rx-agcparams.1800", write_rx_agcparams_table},
+	{0x1113, "rx-calchan.1900",   write_rx_calchan_table},
+	{0x113C, "rx-agcparams.1900", write_rx_agcparams_table},
+	{0, 0, 0}
+};
+
+main(argc, argv)
+	char **argv;
+{
+	struct calmap *tp;
+	FILE *of;
+
+	if (argc != 2) {
+		fprintf(stderr, "usage: %s fact.bin\n", argv[0]);
+		exit(1);
+	}
+	read_factory_struct(argv[1]);
+	for (tp = pirelli_cal_map; tp->outfile; tp++) {
+		of = fopen(tp->outfile, "w");
+		if (!of) {
+			perror(tp->outfile);
+			exit(1);
+		}
+		tp->fmtfunc(factbuf + tp->offset, of);
+		fclose(of);
+	}
+	exit(0);
+}