FreeCalypso > hg > freecalypso-tools
diff ffstools/caltools/fc-rftab2c.c @ 439:f4a32c1025a2
fc-rftab2c program written, compiles
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 17 Nov 2018 02:15:07 +0000 |
parents | |
children | 5bcf12be0834 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ffstools/caltools/fc-rftab2c.c Sat Nov 17 02:15:07 2018 +0000 @@ -0,0 +1,226 @@ +/* + * This utility reads an RF parameter table of one of the supported types + * in FreeCalypso ASCII format (it has to be one of the tables that go + * into the T_RF_BAND structure) and converts it into a C code snippet + * suitable for insertion into the firmware source in the L1 RF "customization" + * code where compiled-in default RF parameter tables are defined. + * + * This tool is primarily intended for use with tx-ramps tables and maybe + * tx-levels, but it also supports tx-calchan, tx-caltemp, rx-agc-params, + * rx-calchan and rx-caltemp tables. + * + * This program is based on the calextract tool from 2014 (freecalypso-reveng + * repository) and the generated C code snippets feature the same style, + * indentation and comments. + */ + +#include <sys/types.h> +#include <stdio.h> +#include <stdint.h> +#include <endian.h> +#include <stdlib.h> + +u_char binbuf[512]; + +static unsigned +get_u16(bin) + u_char *bin; +{ + return le16toh(*(uint16_t *)bin); +} + +static int +get_s16(bin) + u_char *bin; +{ + int i; + + i = le16toh(*(uint16_t *)bin); + if (i >= 32768) + i -= 65536; + return(i); +} + +void +do_rx_cal_params() +{ + u_char *bp = binbuf; + int i; + + puts(" { /* T_RX_CAL_PARAMS */"); + for (i = 0; i < 4; i++) { + printf("%10u,\n", get_u16(bp)); + bp += 2; + } + puts(" },"); +} + +void +do_rx_agc_bands() +{ + u_char *bp = binbuf; + int i, s; + unsigned u; + + puts(" { /* T_RF_AGC_BANDs */"); + for (i = 0; i < 10; i++) { + u = get_u16(bp); + bp += 2; + s = get_s16(bp); + bp += 2; + printf(" {%5u,%6d},\n", u, s); + } + puts(" },"); +} + +void +do_rx_temp_comp() +{ + u_char *bp = binbuf; + int i, s1, s2; + + puts(" { /* Rx temperature compensation */"); + for (i = 0; i < 11; i++) { + s1 = get_s16(bp); + bp += 2; + s2 = get_s16(bp); + bp += 2; + printf(" {%6d,%6d},\n", s1, s2); + } + puts(" },"); +} + +void +do_tx_levels() +{ + u_char *bp = binbuf; + unsigned i, u, b1, b2; + + puts(" { /* levels */"); + for (i = 0; i < 32; i++) { + u = get_u16(bp); + bp += 2; + b1 = *bp++; + b2 = *bp++; + printf(" {%5u,%3u,%3u}, /* %u */\n", u, b1, b2, i); + } + puts(" },"); +} + +void +do_tx_calchan() +{ + u_char *bp = binbuf; + int i, j, s; + unsigned u; + + puts(" { /* channel calibration tables */"); + for (i = 0; i < 4; i++) { + printf(" { /* calibration table %d */\n", i); + for (j = 0; j < 8; j++) { + u = get_u16(bp); + bp += 2; + s = get_s16(bp); + bp += 2; + printf("\t{%5u,%6d},\n", u, s); + } + puts(" },"); + } + puts(" },"); +} + +static void +do_ramp_16bytes(bin) + u_char *bin; +{ + u_char *bp = bin; + int i, b; + + putchar('\t'); + putchar('{'); + for (i = 0; i < 16; i++) { + b = *bp++; + printf("%3d%c", b, i == 15 ? '}' : ','); + } + putchar(','); + putchar('\n'); +} + +void +do_tx_ramps() +{ + u_char *bp = binbuf; + int i; + + puts(" { /* ramps */"); + for (i = 0; i < 16; i++) { + printf(" { /* profile %d */\n", i); + puts("\t/* ramp-up */"); + do_ramp_16bytes(bp); + bp += 16; + puts("\t/* ramp-down */"); + do_ramp_16bytes(bp); + bp += 16; + puts(" },"); + } + puts(" },"); +} + +void +do_tx_temp_comp() +{ + u_char *bp = binbuf; + int i, j, s[4]; + + puts(" { /* Tx temperature compensation */"); + for (i = 0; i < 5; i++) { + for (j = 0; j < 4; j++) { + s[j] = get_s16(bp); + bp += 2; + } + printf(" {%6d,%6d,%6d,%6d},\n", s[0], s[1], s[2], s[3]); + } + puts(" },"); +} + +static struct map { + char *format; + void (*func)(); +} map_table[] = { + {"tx-ramps", do_tx_ramps}, + {"tx-levels", do_tx_levels}, + {"tx-calchan", do_tx_calchan}, + {"tx-caltemp", do_tx_temp_comp}, + {"rx-calchan", do_rx_agc_bands}, + {"rx-caltemp", do_rx_temp_comp}, + {"rx-agc-params", do_rx_cal_params}, + {0, 0} +}; + +main(argc, argv) + char **argv; +{ + char *format; + struct map *map; + + if (argc < 2 || argc > 3) { + fprintf(stderr, "usage: %s ascii-rftab-file [C-output-file]\n", + argv[0]); + exit(1); + } + if (read_rf_table_ext(argv[1], binbuf, 1, &format, 0)) + exit(1); + for (map = map_table; map->format; map++) + if (!strcmp(map->format, format)) + break; + if (!map->func) { + printf("error: %s tables are not supported\n", format); + exit(1); + } + if (argc >= 3 && !freopen(argv[2], "w", stdout)) { + perror(argv[2]); + exit(1); + } + map->func(); + exit(0); +}