# HG changeset patch # User Mychaela Falconia # Date 1496002334 0 # Node ID b6a95d35fabc83e70c7e33e46f3df53a9532230a # Parent 7d7a4367ec2884ad7c0a2761315b38470137a320 pircalextr program written, compiles diff -r 7d7a4367ec28 -r b6a95d35fabc .hgignore --- a/.hgignore Tue Mar 14 06:19:52 2017 +0000 +++ b/.hgignore Sun May 28 20:12:14 2017 +0000 @@ -33,6 +33,7 @@ ^miscprog/imeibrute$ ^miscprog/memwrite-grep$ ^miscprog/mokosrec2bin$ +^miscprog/pircalextr$ ^miscprog/pircksum$ ^miscprog/pircksum2$ ^miscprog/pirimei$ diff -r 7d7a4367ec28 -r b6a95d35fabc miscprog/Makefile --- a/miscprog/Makefile Tue Mar 14 06:19:52 2017 +0000 +++ b/miscprog/Makefile Sun May 28 20:12:14 2017 +0000 @@ -1,7 +1,7 @@ CC= gcc CFLAGS= -O2 -STD= atsc calextract factdiff grokdsn memwrite-grep mokosrec2bin pircksum \ - pircksum2 rfcap-grep +STD= atsc calextract factdiff grokdsn memwrite-grep mokosrec2bin pircalextr \ + pircksum pircksum2 rfcap-grep CRYPTO= imeibrute pirimei PROGS= ${STD} ${CRYPTO} @@ -20,6 +20,7 @@ imeibrute: imeibrute.c memwrite-grep: memwrite-grep.c mokosrec2bin: mokosrec2bin.c +pircalextr: pircalextr.c pircksum: pircksum.c pircksum2: pircksum2.c pirimei: pirimei.c diff -r 7d7a4367ec28 -r b6a95d35fabc miscprog/pircalextr.c --- /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 +#include +#include +#include +#include +#include +#include +#include + +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); +}