Enable EEPROM to force direct sampling mode

Re-purpose remote-enabled EEPROM flag to determine if direct sampling mode should be forced ON. Useful for apps that don't have any direct sampling mode settings in their GUI.
master
rtlsdrblog 5 years ago committed by GitHub
parent 4f6c1b2e98
commit 4ff1c4f74f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 81
      src/rtl_eeprom.c

@ -43,8 +43,8 @@ typedef struct rtlsdr_config {
char product[MAX_STR_SIZE];
char serial[MAX_STR_SIZE];
int have_serial;
int enable_ir;
int remote_wakeup;
int enable_bt;
int direct_sampling_on;
} rtlsdr_config_t;
void dump_config(rtlsdr_config_t *conf)
@ -57,10 +57,10 @@ void dump_config(rtlsdr_config_t *conf)
fprintf(stderr, "Serial number:\t\t%s\n", conf->serial);
fprintf(stderr, "Serial number enabled:\t");
fprintf(stderr, conf->have_serial ? "yes\n": "no\n");
fprintf(stderr, "IR endpoint enabled:\t");
fprintf(stderr, conf->enable_ir ? "yes\n": "no\n");
fprintf(stderr, "Remote wakeup enabled:\t");
fprintf(stderr, conf->remote_wakeup ? "yes\n": "no\n");
fprintf(stderr, "Bias-T Always ON:\t");
fprintf(stderr, conf->enable_bt ? "no\n": "yes\n"); // 0 is ON for this
fprintf(stderr, "Direct Sampling Always ON:\t");
fprintf(stderr, conf->direct_sampling_on ? "yes\n": "no\n");
fprintf(stderr, "__________________________________________\n");
}
@ -74,7 +74,8 @@ void usage(void)
"\t[-m <str> set manufacturer string]\n"
"\t[-p <str> set product string]\n"
"\t[-s <str> set serial number string]\n"
"\t[-i <0,1> disable/enable IR-endpoint]\n"
"\t[-b <\"y\",\"n\"> enable/disable bias tee always ON]\n"
"\t[-q <\"y\",\"n\"> enable/disable direct sampling always ON]\n"
"\t[-g <conf> generate default config and write to device]\n"
"\t[ <conf> can be one of:]\n"
"\t[ realtek\t\tRealtek default (as without EEPROM)]\n"
@ -139,8 +140,8 @@ int parse_eeprom_to_conf(rtlsdr_config_t *conf, uint8_t *dat)
conf->vendor_id = dat[2] | (dat[3] << 8);
conf->product_id = dat[4] | (dat[5] << 8);
conf->have_serial = (dat[6] == 0xa5) ? 1 : 0;
conf->remote_wakeup = (dat[7] & 0x01) ? 1 : 0;
conf->enable_ir = (dat[7] & 0x02) ? 1 : 0;
conf->direct_sampling_on = (dat[7] & 0x01) ? 1 : 0;
conf->enable_bt = (dat[7] & 0x02) ? 1 : 0;
pos = get_string_descriptor(STR_OFFSET, dat, conf->manufacturer);
pos = get_string_descriptor(pos, dat, conf->product);
@ -161,8 +162,8 @@ int gen_eeprom_from_conf(rtlsdr_config_t *conf, uint8_t *dat)
dat[5] = (conf->product_id >> 8) & 0xff;
dat[6] = conf->have_serial ? 0xa5 : 0x00;
dat[7] = 0x14;
dat[7] |= conf->remote_wakeup ? 0x01 : 0x00;
dat[7] |= conf->enable_ir ? 0x02 : 0x00;
dat[7] |= conf->direct_sampling_on ? 0x01 : 0x00;
dat[7] |= conf->enable_bt ? 0x02 : 0x00;
dat[8] = 0x02;
pos = set_string_descriptor(STR_OFFSET, dat, conf->manufacturer);
@ -194,8 +195,8 @@ void gen_default_conf(rtlsdr_config_t *conf, int config)
strcpy(conf->product, "RTL2832U DVB-T");
strcpy(conf->serial, "0");
conf->have_serial = 1;
conf->enable_ir = 0;
conf->remote_wakeup = 1;
conf->enable_bt = 0;
conf->direct_sampling_on = 1;
break;
case REALTEK_EEPROM:
fprintf(stderr, "Realtek default OEM with EEPROM\n");
@ -205,8 +206,8 @@ void gen_default_conf(rtlsdr_config_t *conf, int config)
strcpy(conf->product, "RTL2838UHIDIR");
strcpy(conf->serial, "00000001");
conf->have_serial = 1;
conf->enable_ir = 1;
conf->remote_wakeup = 0;
conf->enable_bt = 1;
conf->direct_sampling_on = 0;
break;
case TERRATEC_NOXON:
fprintf(stderr, "Terratec NOXON DAB Stick\n");
@ -216,8 +217,8 @@ void gen_default_conf(rtlsdr_config_t *conf, int config)
strcpy(conf->product, "DAB Stick");
strcpy(conf->serial, "0");
conf->have_serial = 1;
conf->enable_ir = 0;
conf->remote_wakeup = 1;
conf->enable_bt = 0;
conf->direct_sampling_on = 1;
break;
case TERRATEC_T_BLACK:
fprintf(stderr, "Terratec T Stick Black\n");
@ -227,8 +228,8 @@ void gen_default_conf(rtlsdr_config_t *conf, int config)
strcpy(conf->product, "RTL2838UHIDIR");
strcpy(conf->serial, "00000001");
conf->have_serial = 1;
conf->enable_ir = 1;
conf->remote_wakeup = 0;
conf->enable_bt = 1;
conf->direct_sampling_on = 0;
break;
case TERRATEC_T_PLUS:
fprintf(stderr, "Terratec ran T Stick+\n");
@ -238,8 +239,8 @@ void gen_default_conf(rtlsdr_config_t *conf, int config)
strcpy(conf->product, "RTL2838UHIDIR");
strcpy(conf->serial, "00000001");
conf->have_serial = 1;
conf->enable_ir = 1;
conf->remote_wakeup = 0;
conf->enable_bt = 1;
conf->direct_sampling_on = 0;
break;
default:
break;
@ -261,10 +262,11 @@ int main(int argc, char **argv)
int flash_file = 0;
int default_config = 0;
int change = 0;
int ir_endpoint = 0;
int enable_bt = 0;
int direct_sampling_on = 0;
char ch;
while ((opt = getopt(argc, argv, "d:m:p:s:i:g:w:r:h?")) != -1) {
while ((opt = getopt(argc, argv, "d:m:p:s:b:q:g:w:r:h?")) != -1) {
switch (opt) {
case 'd':
dev_index = atoi(optarg);
@ -281,8 +283,30 @@ int main(int argc, char **argv)
serial_str = optarg;
change = 1;
break;
case 'i':
ir_endpoint = (atoi(optarg) > 0) ? 1 : -1;
case 'b':
if(strcmp(optarg, "y") == 0)
{
enable_bt = 1;
}
else if(strcmp(optarg, "n") == 0)
{
enable_bt = -1;
}
//enable_bt = (!strcmp(optarg, "y")) ? 1 : -1;
//ir_endpoint = (atoi(optarg) > 0) ? 1 : -1;
change = 1;
break;
case 'q':
if(strcmp(optarg, "y") == 0)
{
direct_sampling_on = 1;
}
else if(strcmp(optarg, "n") == 0)
{
direct_sampling_on = -1;
}
//direct_sampling_on = (!strcmp(optarg, "y")) ? 1 : -1;
//direct_sampling_on = (atoi(optarg) > 0) ? 1 : -1;
change = 1;
break;
case 'g':
@ -380,8 +404,11 @@ int main(int argc, char **argv)
strncpy((char*)&conf.serial, serial_str, MAX_STR_SIZE);
}
if (ir_endpoint != 0)
conf.enable_ir = (ir_endpoint > 0) ? 1 : 0;
if (enable_bt != 0)
conf.enable_bt = (enable_bt > 0) ? 0 : 1;
if (direct_sampling_on != 0)
conf.direct_sampling_on = (direct_sampling_on > 0) ? 1 : 0;
if (!change)
goto exit;

Loading…
Cancel
Save