view rvinterf/tmsh/saverftab.c @ 916:54a0bc149d9c

fc-loadtool: add support for Samsung K5L29xx_A flash
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 30 Dec 2022 21:07:30 +0000
parents 6b01d4ef85c3
children
line wrap: on
line source

/*
 * Here we implement fc-tmsh operator commands which save the RF table data
 * received via rftr and ttr commands into files.
 */

#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include "l1tm.h"
#include "exitcodes.h"

extern unsigned rftr_table_index, rftr_table_size;
extern u_char rftr_table_data[];
extern u_char ttr_ramp_data[];

extern void write_afcparams_table();
extern void write_agcwords_table();
extern void write_agcglobals_table();
extern void write_il2agc_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 {
	int	index;
	int	size;
	void	(*func)();
} table_map[] = {
	{RX_AGC_TABLE,		40,	write_agcwords_table},
	{AFC_PARAMS,		24,	write_afcparams_table},
	{RX_AGC_GLOBAL_PARAMS,	8,	write_agcglobals_table},
	{RX_IL_2_AGC_MAX,	121,	write_il2agc_table},
	{RX_IL_2_AGC_PWR,	121,	write_il2agc_table},
	{RX_IL_2_AGC_AV,	121,	write_il2agc_table},
	{TX_LEVELS,		128,	write_tx_levels_table},
	{TX_CAL_CHAN,		128,	write_tx_calchan_table},
	{TX_CAL_TEMP,		40,	write_tx_caltemp_table},
	{RX_CAL_CHAN,		40,	write_rx_calchan_table},
	{RX_CAL_TEMP,		44,	write_rx_caltemp_table},
	{RX_AGC_PARAMS,		8,	write_rx_agcparams_table},
	{0,			0,	0}
};

cmd_save_rf_table(argc, argv)
	char **argv;
{
	struct table_map *tp;
	FILE *outf;

	if (!rftr_table_size) {
		printf("error: no RF table has been received\n");
		return(ERROR_TARGET);
	}
	for (tp = table_map; tp->index; tp++) {
		if (tp->index == rftr_table_index)
			break;
	}
	if (!tp->index) {
		printf("error: received table index %u not known\n",
			rftr_table_index);
		return(ERROR_TARGET);
	}
	if (rftr_table_size != tp->size &&
	    (rftr_table_index != RX_AGC_PARAMS || rftr_table_size != 10)) {
		printf("error: received table index and size don't match\n");
		return(ERROR_TARGET);
	}
	outf = fopen(argv[1], "w");
	if (!outf) {
		perror(argv[1]);
		return(ERROR_UNIX);
	}
	tp->func(rftr_table_data, outf);
	fclose(outf);
	return(0);
}

cmd_save_rf_table_raw(argc, argv)
	char **argv;
{
	FILE *outf;
	int off, l, j;

	if (!rftr_table_size) {
		printf("error: no RF table has been received\n");
		return(ERROR_TARGET);
	}
	outf = fopen(argv[1], "w");
	if (!outf) {
		perror(argv[1]);
		return(ERROR_UNIX);
	}
	fputs("rf_table raw\n\n", outf);
	for (off = 0; off < rftr_table_size; ) {
		l = rftr_table_size - off;
		if (l > 16)
			l = 16;
		for (j = 0; j < l; j++) {
			if (j)
				putc(' ', outf);
			if (j == 8)
				putc(' ', outf);
			fprintf(outf, "%02X", rftr_table_data[off++]);
		}
		putc('\n', outf);
	}
	fclose(outf);
	return(0);
}

cmd_save_tx_ramp(argc, argv)
	char **argv;
{
	FILE *outf;

	outf = fopen(argv[1], "w");
	if (!outf) {
		perror(argv[1]);
		return(ERROR_UNIX);
	}
	write_tx_ramp(ttr_ramp_data, outf);
	fclose(outf);
	return(0);
}