line source
/*
* This utility reads a binary RF table or extracts it out of some larger
* binary file such as an alien fw image (the user must specify the offset
* in the binary file and the expected RF table type), and emits it in our
* FreeCalypso ASCII format.
*/
#include <sys/types.h>
#include <sys/file.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
extern void write_adccal_table();
extern void write_afcparams_table();
extern void write_agcwords_table();
extern void write_agcglobals_table();
extern void write_il2agc_table();
extern void write_tx_ramps_table();
extern void write_tx_levels_table();
extern void write_tx_calchan_table();
extern void write_tx_caltemp_table();
extern void write_rx_calchan_table();
extern void write_rx_caltemp_table();
extern void write_rx_agcparams_table();
static struct table_map {
char *type;
int size;
void (*func)();
} table_map[] = {
{"adc-cal", 36, write_adccal_table},
{"afcparams", 24, write_afcparams_table},
{"agc-table", 40, write_agcwords_table},
{"agc-global-params", 8, write_agcglobals_table},
{"il2agc", 121, write_il2agc_table},
{"tx-ramps", 512, write_tx_ramps_table},
{"tx-levels", 128, write_tx_levels_table},
{"tx-calchan", 128, write_tx_calchan_table},
{"tx-caltemp", 40, write_tx_caltemp_table},
{"rx-calchan", 40, write_rx_calchan_table},
{"rx-caltemp", 44, write_rx_caltemp_table},
{"rx-agc-params", 8, write_rx_agcparams_table},
{0, 0, 0}
};
main(argc, argv)
char **argv;
{
struct table_map *tp;
u_char buf[512];
int ifd, cc;
u_long offset;
char *endp;
FILE *outf;
if (argc < 4 || argc > 5) {
fprintf(stderr, "usage: %s binfile offset type [outfile]\n",
argv[0]);
exit(1);
}
ifd = open(argv[1], O_RDONLY);
if (ifd < 0) {
perror(argv[1]);
exit(1);
}
if (!isdigit(argv[2][0])) {
inv_offset: fprintf(stderr, "error: specified offset \"%s\" is invalid\n",
argv[2]);
exit(1);
}
offset = strtoul(argv[2], &endp, 0);
if (*endp)
goto inv_offset;
lseek(ifd, offset, SEEK_SET);
for (tp = table_map; tp->type; tp++)
if (!strcmp(tp->type, argv[3]))
break;
if (!tp->type) {
fprintf(stderr, "error: RF table type \"%s\" not known\n",
argv[3]);
exit(1);
}
cc = read(ifd, buf, tp->size);
if (cc < 0) {
perror("error reading from file");
exit(1);
}
if (cc != tp->size) {
fprintf(stderr, "error: short read\n");
exit(1);
}
close(ifd);
if (argc >= 5) {
outf = fopen(argv[4], "w");
if (!outf) {
perror(argv[4]);
exit(1);
}
tp->func(buf, outf);
fclose(outf);
} else
tp->func(buf, stdout);
exit(0);
}