mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-20 21:33:47 -07:00
lf config - now uses cliparser
This commit is contained in:
parent
e3aa035be7
commit
967f5ffd51
1 changed files with 87 additions and 95 deletions
|
@ -93,28 +93,6 @@ static int usage_lf_cmdread(void) {
|
||||||
PrintAndLogEx(NORMAL, " use " _YELLOW_("'lf config'")" to set parameters.");
|
PrintAndLogEx(NORMAL, " use " _YELLOW_("'lf config'")" to set parameters.");
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
static int usage_lf_config(void) {
|
|
||||||
PrintAndLogEx(NORMAL, "Usage: lf config [h] [L | H | q <divisor> | f <freq>] [b <bps>] [d <decim>] [a 0|1]");
|
|
||||||
PrintAndLogEx(NORMAL, "Options:");
|
|
||||||
PrintAndLogEx(NORMAL, " h This help");
|
|
||||||
PrintAndLogEx(NORMAL, " L Low frequency (125 kHz)");
|
|
||||||
PrintAndLogEx(NORMAL, " H High frequency (134 kHz)");
|
|
||||||
PrintAndLogEx(NORMAL, " q <divisor> Manually set freq divisor. %d -> 134 kHz, %d -> 125 kHz", LF_DIVISOR_134, LF_DIVISOR_125);
|
|
||||||
PrintAndLogEx(NORMAL, " f <freq> Manually set frequency in kHz");
|
|
||||||
PrintAndLogEx(NORMAL, " b <bps> Sets resolution of bits per sample. Default (max): 8");
|
|
||||||
PrintAndLogEx(NORMAL, " d <decimate> Sets decimation. A value of N saves only 1 in N samples. Default: 1");
|
|
||||||
PrintAndLogEx(NORMAL, " a [0|1] Averaging - if set, will average the stored sample value when decimating. Default: 1");
|
|
||||||
PrintAndLogEx(NORMAL, " t <threshold> Sets trigger threshold. 0 means no threshold (range: 0-128)");
|
|
||||||
PrintAndLogEx(NORMAL, " s <samplestoskip> Sets a number of samples to skip before capture. Default: 0");
|
|
||||||
PrintAndLogEx(NORMAL, "Examples:");
|
|
||||||
PrintAndLogEx(NORMAL, _YELLOW_(" lf config") " - shows current config");
|
|
||||||
PrintAndLogEx(NORMAL, _YELLOW_(" lf config b 8 L") " - samples at 125 kHz, 8bps.");
|
|
||||||
PrintAndLogEx(NORMAL, _YELLOW_(" lf config H b 4 d 3") " - samples at 134 kHz, averages three samples into one, stored with ");
|
|
||||||
PrintAndLogEx(NORMAL, " a resolution of 4 bits per sample.");
|
|
||||||
PrintAndLogEx(NORMAL, _YELLOW_(" lf read") " - performs a read (active field)");
|
|
||||||
PrintAndLogEx(NORMAL, _YELLOW_(" lf sniff") " - performs a sniff (no active field)");
|
|
||||||
return PM3_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Informative user function.
|
// Informative user function.
|
||||||
// loop and wait for either keyboard press or pm3 button to exit
|
// loop and wait for either keyboard press or pm3 button to exit
|
||||||
|
@ -501,14 +479,59 @@ int lf_config(sample_config *config) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int CmdLFConfig(const char *Cmd) {
|
int CmdLFConfig(const char *Cmd) {
|
||||||
|
CLIParserContext *ctx;
|
||||||
|
CLIParserInit(&ctx, "lf config",
|
||||||
|
"Get/Set config for LF sampling, bit/sample, decimation, frequency\n"
|
||||||
|
"These changes are temporary, will be reset after a power cycle.\n\n"
|
||||||
|
" - use " _YELLOW_("`lf read`") _CYAN_(" performs a read (active field)\n")
|
||||||
|
_CYAN_(" - use ") _YELLOW_("`lf sniff`") _CYAN_(" performs a sniff (no active field)"),
|
||||||
|
"lf config --> shows current config\n"
|
||||||
|
"lf config -b 8 --125 --> samples at 125 kHz, 8 bps\n"
|
||||||
|
"lf config -b 4 --134 --dec 3 --> samples at 134 kHz, averages three samples into one, stored with a resolution of 4 bits per sample"
|
||||||
|
"lf config --trig 20 -s 10000 --> trigger sampling when above 20, skip 10 000 first samples after triggered\n"
|
||||||
|
);
|
||||||
|
|
||||||
if (!session.pm3_present) return PM3_ENOTTY;
|
char div_str[70] = {0};
|
||||||
|
sprintf(div_str, "Manually set freq divisor. %d -> 134 kHz, %d -> 125 kHz", LF_DIVISOR_134, LF_DIVISOR_125);
|
||||||
|
|
||||||
|
void *argtable[] = {
|
||||||
|
arg_param_begin,
|
||||||
|
arg_lit0(NULL, "125", "125 kHz frequency"),
|
||||||
|
arg_lit0(NULL, "134", "134 kHz frequency"),
|
||||||
|
arg_int0("a", "avg", "<0|1>", "averaging - if set, will average the stored sample value when decimating (default 1)"),
|
||||||
|
arg_int0("b", "bps", "<1-8>", "sets resolution of bits per sample (default 8)"),
|
||||||
|
arg_int0(NULL, "dec", "<1-8>", "sets decimation. A value of N saves only 1 in N samples (default 1)"),
|
||||||
|
arg_int0(NULL, "divisor", "<19-255>", div_str),
|
||||||
|
arg_int0("f", "freq", "<47-600>", "manually set frequency in kHz"),
|
||||||
|
arg_int0("s", "skip", "<dec>", "sets a number of samples to skip before capture (default 0)"),
|
||||||
|
arg_int0("t", "trig", "<0-128>", "sets trigger threshold. 0 means no threshold"),
|
||||||
|
arg_param_end
|
||||||
|
};
|
||||||
|
CLIExecWithReturn(ctx, Cmd, argtable, true);
|
||||||
|
bool use_125 = arg_get_lit(ctx, 1);
|
||||||
|
bool use_134 = arg_get_lit(ctx, 2);
|
||||||
|
int8_t avg = arg_get_int_def(ctx, 3, 0);
|
||||||
|
int8_t bps = arg_get_int_def(ctx, 4, -1);
|
||||||
|
int8_t dec = arg_get_int_def(ctx, 5, -1);
|
||||||
|
int16_t div = arg_get_int_def(ctx, 6, -1);
|
||||||
|
int16_t freq = arg_get_int_def(ctx, 7, -1);
|
||||||
|
int32_t skip = arg_get_int_def(ctx, 8, -1);
|
||||||
|
int16_t trigg = arg_get_int_def(ctx, 9, -1);
|
||||||
|
CLIParserFree(ctx);
|
||||||
|
|
||||||
|
if (session.pm3_present == false)
|
||||||
|
return PM3_ENOTTY;
|
||||||
|
|
||||||
// if called with no params, just print the device config
|
// if called with no params, just print the device config
|
||||||
if (strlen(Cmd) == 0) {
|
if (strlen(Cmd) == 0) {
|
||||||
return lf_config(NULL);
|
return lf_config(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (use_125 + use_134 > 1) {
|
||||||
|
PrintAndLogEx(ERR,"use only one of 125 or 134 params");
|
||||||
|
return PM3_EINVARG;
|
||||||
|
}
|
||||||
|
|
||||||
sample_config config = {
|
sample_config config = {
|
||||||
.decimation = -1,
|
.decimation = -1,
|
||||||
.bits_per_sample = -1,
|
.bits_per_sample = -1,
|
||||||
|
@ -519,87 +542,56 @@ int CmdLFConfig(const char *Cmd) {
|
||||||
.verbose = true
|
.verbose = true
|
||||||
};
|
};
|
||||||
|
|
||||||
bool errors = false;
|
/*
|
||||||
|
int8_t bps = arg_get_int_def(ctx, 4, 8);
|
||||||
|
int8_t dec = arg_get_int_def(ctx, 5, 1);
|
||||||
|
int16_t div = arg_get_int_def(ctx, 6, 95);
|
||||||
|
int16_t freq = arg_get_int_def(ctx, 7, 125);
|
||||||
|
*/
|
||||||
|
if (use_125)
|
||||||
|
config.divisor = LF_DIVISOR_125;
|
||||||
|
|
||||||
uint8_t cmdp = 0;
|
if (use_134)
|
||||||
while (param_getchar(Cmd, cmdp) != 0x00 && !errors) {
|
config.divisor = LF_DIVISOR_134;
|
||||||
switch (param_getchar(Cmd, cmdp)) {
|
|
||||||
case 'h':
|
|
||||||
return usage_lf_config();
|
|
||||||
case 'H':
|
|
||||||
config.divisor = LF_DIVISOR_134;
|
|
||||||
cmdp++;
|
|
||||||
break;
|
|
||||||
case 'L':
|
|
||||||
config.divisor = LF_DIVISOR_125;
|
|
||||||
cmdp++;
|
|
||||||
break;
|
|
||||||
case 'q':
|
|
||||||
config.divisor = param_get8ex(Cmd, cmdp + 1, 95, 10);
|
|
||||||
if (config.divisor < 19) {
|
|
||||||
PrintAndLogEx(ERR, "divisor must be between 19 and 255");
|
|
||||||
return PM3_EINVARG;
|
|
||||||
}
|
|
||||||
cmdp += 2;
|
|
||||||
break;
|
|
||||||
case 'f': {
|
|
||||||
int freq = param_get32ex(Cmd, cmdp + 1, 125, 10);
|
|
||||||
config.divisor = LF_FREQ2DIV(freq);
|
|
||||||
if (config.divisor < 19) {
|
|
||||||
PrintAndLogEx(ERR, "freq must be between 47 and 600");
|
|
||||||
return PM3_EINVARG;
|
|
||||||
}
|
|
||||||
cmdp += 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 't': {
|
|
||||||
uint8_t trigg = 0;
|
|
||||||
errors |= param_getdec(Cmd, cmdp + 1, &trigg);
|
|
||||||
cmdp += 2;
|
|
||||||
if (!errors) {
|
|
||||||
config.trigger_threshold = trigg;
|
|
||||||
g_lf_threshold_set = (config.trigger_threshold > 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'b': {
|
|
||||||
config.bits_per_sample = param_get8ex(Cmd, cmdp + 1, 8, 10);
|
|
||||||
|
|
||||||
// bps is limited to 8
|
config.averaging = (avg == 1);
|
||||||
if (config.bits_per_sample >> 4)
|
|
||||||
config.bits_per_sample = 8;
|
|
||||||
|
|
||||||
cmdp += 2;
|
if (bps > -1) {
|
||||||
break;
|
// bps is limited to 8
|
||||||
}
|
config.bits_per_sample = (bps & 0x0F);
|
||||||
case 'd': {
|
if (config.bits_per_sample > 8)
|
||||||
config.decimation = param_get8ex(Cmd, cmdp + 1, 1, 10);
|
config.bits_per_sample = 8;
|
||||||
|
}
|
||||||
|
|
||||||
// decimation is limited to 255
|
if ( dec > -1 ) {
|
||||||
if (config.decimation >> 4)
|
// decimation is limited to 8
|
||||||
config.decimation = 8;
|
config.decimation = (dec & 0x0F);
|
||||||
|
if (config.decimation > 8)
|
||||||
|
config.decimation = 8;
|
||||||
|
}
|
||||||
|
|
||||||
cmdp += 2;
|
if ( div > -1 ) {
|
||||||
break;
|
config.divisor = div;
|
||||||
}
|
if (config.divisor < 19) {
|
||||||
case 'a':
|
PrintAndLogEx(ERR, "divisor must be between 19 and 255");
|
||||||
config.averaging = (param_getchar(Cmd, cmdp + 1) == '1');
|
return PM3_EINVARG;
|
||||||
cmdp += 2;
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
config.samples_to_skip = param_get32ex(Cmd, cmdp + 1, 0, 10);
|
|
||||||
cmdp += 2;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp));
|
|
||||||
errors = 1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// validations
|
if (freq > -1 ) {
|
||||||
if (errors) return usage_lf_config();
|
config.divisor = LF_FREQ2DIV(freq);
|
||||||
|
if (config.divisor < 19) {
|
||||||
|
PrintAndLogEx(ERR, "freq must be between 47 and 600");
|
||||||
|
return PM3_EINVARG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trigg > -1) {
|
||||||
|
config.trigger_threshold = trigg;
|
||||||
|
g_lf_threshold_set = (config.trigger_threshold > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
config.samples_to_skip = skip;
|
||||||
return lf_config(&config);
|
return lf_config(&config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue