FreeCalypso > hg > freecalypso-reveng
diff miscprog/calextract.c @ 180:25b54c5ad6c2
calextract tool written, works
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sat, 12 Jul 2014 00:05:22 +0000 |
parents | |
children | c38075b8a625 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/miscprog/calextract.c Sat Jul 12 00:05:22 2014 +0000 @@ -0,0 +1,198 @@ +/* + * GSM firmwares constructed per TI's canon contain several hard-coded + * T_RF_BAND structures, one per band, emitted literally in the .const + * section as they are constant initialized data, i.e., + * const T_RF_BAND rf_XXX = { blah }. This utility extracts one of these + * structures from a binary file (hex offset must be given) and parses it + * into a C form suitable for placement in l1_rf12.c in the FreeCalypso + * gsm-fw source. + */ + +#include <stdio.h> +#include <stdlib.h> + +char *binfilename; +FILE *binf; +u_long start_offset; + +getbyte() +{ + int c; + + c = getc(binf); + if (c < 0) { + fprintf(stderr, "error or EOF reading from %s\n", binfilename); + exit(1); + } + return(c); +} + +get_u16() +{ + int lo, hi; + + lo = getbyte(); + hi = getbyte(); + return((hi << 8) | lo); +} + +get_s16() +{ + int i; + + i = get_u16(); + if (i >= 32768) + i -= 65536; + return(i); +} + +do_rx_cal_params() +{ + int i; + + puts(" { /* T_RX_CAL_PARAMS */"); + for (i = 0; i < 4; i++) + printf("%10d,\n", get_u16()); + puts(" },"); +} + +do_rx_agc_bands() +{ + int i, u, s; + + puts(" { /* T_RF_AGC_BANDs */"); + for (i = 0; i < 10; i++) { + u = get_u16(); + s = get_s16(); + printf(" {%5d,%6d},\n", u, s); + } + puts(" },"); +} + +do_rx_temp_comp() +{ + int i, s1, s2; + + puts(" { /* Rx temperature compensation */"); + for (i = 0; i < 11; i++) { + s1 = get_s16(); + s2 = get_s16(); + printf(" {%6d,%6d},\n", s1, s2); + } + puts(" },"); +} + +do_rx() +{ + puts(" { /* Rx structure */"); + do_rx_cal_params(); + do_rx_agc_bands(); + do_rx_temp_comp(); + puts(" },"); +} + +do_tx_levels() +{ + int i, u, b1, b2; + + puts(" { /* levels */"); + for (i = 0; i < 32; i++) { + u = get_u16(); + b1 = getbyte(); + b2 = getbyte(); + printf(" {%5d,%3d,%3d}, /* %d */\n", u, b1, b2, i); + } + puts(" },"); +} + +do_tx_calchan() +{ + int i, j, u, s; + + 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(); + s = get_s16(); + printf("\t{%5d,%6d},\n", u, s); + } + puts(" },"); + } + puts(" },"); +} + +do_ramp_16bytes() +{ + int i, b; + + putchar('\t'); + putchar('{'); + for (i = 0; i < 16; i++) { + b = getbyte(); + printf("%3d%c", b, i == 15 ? '}' : ','); + } + putchar(','); + putchar('\n'); +} + +do_tx_ramps() +{ + int i; + + puts(" { /* ramps */"); + for (i = 0; i < 16; i++) { + printf(" { /* profile %d */\n", i); + puts("\t/* ramp-up */"); + do_ramp_16bytes(); + puts("\t/* ramp-down */"); + do_ramp_16bytes(); + puts(" },"); + } + puts(" },"); +} + +do_tx_temp_comp() +{ + 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(); + printf(" {%6d,%6d,%6d,%6d},\n", s[0], s[1], s[2], s[3]); + } + puts(" },"); +} + +do_tx() +{ + puts(" { /* Tx structure */"); + do_tx_levels(); + do_tx_calchan(); + do_tx_ramps(); + do_tx_temp_comp(); + puts(" },"); +} + +main(argc, argv) + char **argv; +{ + if (argc != 3) { + fprintf(stderr, "usage: %s binfile hex-offset\n", argv[0]); + exit(1); + } + binfilename = argv[1]; + start_offset = strtoul(argv[2], 0, 16); + binf = fopen(binfilename, "r"); + if (!binf) { + perror(binfilename); + exit(1); + } + fseek(binf, start_offset, SEEK_SET); + puts("const T_RF_BAND rf_XXX = {"); + do_rx(); + do_tx(); + printf(" %d\n}\n", getbyte()); + exit(0); +}