FreeCalypso > hg > freecalypso-reveng
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 217:7d7a4367ec28 | 218:b6a95d35fabc |
|---|---|
| 1 /* | |
| 2 * This program extracts the RF calibration tables from a dump of Pirelli's | |
| 3 * factory sector and saves them in FreeCalypso ASCII format. | |
| 4 */ | |
| 5 | |
| 6 #include <sys/types.h> | |
| 7 #include <sys/file.h> | |
| 8 #include <sys/stat.h> | |
| 9 #include <stdio.h> | |
| 10 #include <stdint.h> | |
| 11 #include <endian.h> | |
| 12 #include <stdlib.h> | |
| 13 #include <unistd.h> | |
| 14 | |
| 15 u_char factbuf[0x2000]; | |
| 16 | |
| 17 read_factory_struct(filename) | |
| 18 char *filename; | |
| 19 { | |
| 20 int fd; | |
| 21 struct stat st; | |
| 22 | |
| 23 fd = open(filename, O_RDONLY); | |
| 24 if (fd < 0) { | |
| 25 perror(filename); | |
| 26 exit(1); | |
| 27 } | |
| 28 fstat(fd, &st); | |
| 29 if (!S_ISREG(st.st_mode)) { | |
| 30 fprintf(stderr, "error: %s is not a regular file\n", filename); | |
| 31 exit(1); | |
| 32 } | |
| 33 if (st.st_size != 0x10000) { | |
| 34 fprintf(stderr, | |
| 35 "error: %s is of the wrong size (64 KiB expected)\n", | |
| 36 filename); | |
| 37 exit(1); | |
| 38 } | |
| 39 read(fd, factbuf, sizeof factbuf); | |
| 40 close(fd); | |
| 41 return(0); | |
| 42 } | |
| 43 | |
| 44 unsigned | |
| 45 get_u32(bin) | |
| 46 u_char *bin; | |
| 47 { | |
| 48 return le32toh(*(uint32_t *)bin); | |
| 49 } | |
| 50 | |
| 51 unsigned | |
| 52 get_u16(bin) | |
| 53 u_char *bin; | |
| 54 { | |
| 55 return le16toh(*(uint16_t *)bin); | |
| 56 } | |
| 57 | |
| 58 get_s16(bin) | |
| 59 u_char *bin; | |
| 60 { | |
| 61 int i; | |
| 62 | |
| 63 i = le16toh(*(uint16_t *)bin); | |
| 64 if (i >= 32768) | |
| 65 i -= 65536; | |
| 66 return(i); | |
| 67 } | |
| 68 | |
| 69 void | |
| 70 write_tx_levels_table(bin, outf) | |
| 71 u_char *bin; | |
| 72 FILE *outf; | |
| 73 { | |
| 74 int i; | |
| 75 u_char *p = bin; | |
| 76 | |
| 77 fputs("rf_table tx-levels\n\n", outf); | |
| 78 fputs("# Fields in each entry: apc, ramp_index, chan_cal_index\n\n", | |
| 79 outf); | |
| 80 for (i = 0; i < 32; i++) { | |
| 81 fprintf(outf, "%5u %3u %3u\t# entry %d\n", | |
| 82 get_u16(p), p[2], p[3], i); | |
| 83 p += 4; | |
| 84 } | |
| 85 } | |
| 86 | |
| 87 void | |
| 88 write_tx_calchan_table(bin, outf) | |
| 89 u_char *bin; | |
| 90 FILE *outf; | |
| 91 { | |
| 92 int i, j; | |
| 93 u_char *p = bin; | |
| 94 | |
| 95 fputs("rf_table tx-calchan\n", outf); | |
| 96 for (i = 0; i < 4; i++) { | |
| 97 fprintf(outf, "\n# Channel calibration table %d:\n\n", i); | |
| 98 for (j = 0; j < 8; j++) { | |
| 99 fprintf(outf, "%5u %6d\n", get_u16(p), get_s16(p + 2)); | |
| 100 p += 4; | |
| 101 } | |
| 102 } | |
| 103 } | |
| 104 | |
| 105 void | |
| 106 write_rx_calchan_table(bin, outf) | |
| 107 u_char *bin; | |
| 108 FILE *outf; | |
| 109 { | |
| 110 int i; | |
| 111 u_char *p = bin; | |
| 112 | |
| 113 fputs("rf_table rx-calchan\n\n", outf); | |
| 114 for (i = 0; i < 10; i++) { | |
| 115 fprintf(outf, "%5u %6d\n", get_u16(p), get_s16(p + 2)); | |
| 116 p += 4; | |
| 117 } | |
| 118 } | |
| 119 | |
| 120 void | |
| 121 write_rx_agcparams_table(bin, outf) | |
| 122 u_char *bin; | |
| 123 FILE *outf; | |
| 124 { | |
| 125 fputs("rf_table rx-agc-params\n\n", outf); | |
| 126 fprintf(outf, "%5u\t# g_magic\n", get_u16(bin)); | |
| 127 fprintf(outf, "%5u\t# lna_att\n", get_u16(bin + 2)); | |
| 128 fprintf(outf, "%5u\t# lna_switch_thr_low\n", get_u16(bin + 4)); | |
| 129 fprintf(outf, "%5u\t# lna_switch_thr_high\n", get_u16(bin + 6)); | |
| 130 } | |
| 131 | |
| 132 struct calmap { | |
| 133 unsigned offset; | |
| 134 char *outfile; | |
| 135 void (*fmtfunc)(); | |
| 136 } pirelli_cal_map[] = { | |
| 137 {0x092C, "tx-levels.900", write_tx_levels_table}, | |
| 138 {0x09AD, "tx-calchan.900", write_tx_calchan_table}, | |
| 139 {0x0C2F, "tx-levels.1800", write_tx_levels_table}, | |
| 140 {0x0CB0, "tx-calchan.1800", write_tx_calchan_table}, | |
| 141 {0x0F32, "tx-levels.1900", write_tx_levels_table}, | |
| 142 {0x0FB3, "tx-calchan.1900", write_tx_calchan_table}, | |
| 143 {0x10AF, "rx-calchan.900", write_rx_calchan_table}, | |
| 144 {0x10D8, "rx-agcparams.900", write_rx_agcparams_table}, | |
| 145 {0x10E1, "rx-calchan.1800", write_rx_calchan_table}, | |
| 146 {0x110A, "rx-agcparams.1800", write_rx_agcparams_table}, | |
| 147 {0x1113, "rx-calchan.1900", write_rx_calchan_table}, | |
| 148 {0x113C, "rx-agcparams.1900", write_rx_agcparams_table}, | |
| 149 {0, 0, 0} | |
| 150 }; | |
| 151 | |
| 152 main(argc, argv) | |
| 153 char **argv; | |
| 154 { | |
| 155 struct calmap *tp; | |
| 156 FILE *of; | |
| 157 | |
| 158 if (argc != 2) { | |
| 159 fprintf(stderr, "usage: %s fact.bin\n", argv[0]); | |
| 160 exit(1); | |
| 161 } | |
| 162 read_factory_struct(argv[1]); | |
| 163 for (tp = pirelli_cal_map; tp->outfile; tp++) { | |
| 164 of = fopen(tp->outfile, "w"); | |
| 165 if (!of) { | |
| 166 perror(tp->outfile); | |
| 167 exit(1); | |
| 168 } | |
| 169 tp->fmtfunc(factbuf + tp->offset, of); | |
| 170 fclose(of); | |
| 171 } | |
| 172 exit(0); | |
| 173 } |
